Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121

Чтение отдельной строки из большого файла

06.10.2021, 23:42. Показов 2742. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Т.к. из-за ограничений объема в БД нельзя хранить нужное количество исходных данных (условно большие массивы в json), то их надо перенести в текстовые отдельные файлы. Чтоб не плодить больше количество файлов хочется сделать общие файлы, где построчно будут исходные поля из БД. Т.е. в базу делается запрос, а там указывается, из какого файла и какой строки считать данные. Т.к. весь файл считывать ресурсоемко, то вопрос, как считать лишь отдельную строку (может указав не строку, а номер начального символа и длины строки)?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2021, 23:42
Ответы с готовыми решениями:

Чтение большого файла excel
Добрый день, предупрежу сразу, я только начал изучать программирование и Python. При написании программы для обработки excel файлов...

Чтение большого json файла
Здравствуйте, имеется объёмный json файл (6 mb). При попытке его прочитать вижу, что он читается не полностью, а начинается с какой-то...

Чтение большого файла из потока
Доброго времени суток! Не могли бы вы подсказать,как реализовать чтение большого файла из потока (если долго грузиться,то отменить...

23
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,846
Записей в блоге: 1
07.10.2021, 00:06
Цитата Сообщение от romanrex Посмотреть сообщение
Чтоб не плодить больше количество файлов
Сколько именно файлов ожидается? Почему вы считаете это проблемой?
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
07.10.2021, 00:42
Цитата Сообщение от romanrex Посмотреть сообщение
нельзя хранить нужное количество исходных данных (условно большие массивы в json),
https://dev.mysql.com/doc/refm... -reqs-json

4гб... Скок вы там хотите запихать????
0
 Аватар для sad67man
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
07.10.2021, 00:53
Цитата Сообщение от romanrex Посмотреть сообщение
(условно большие массивы в json)
Уточните, в чем заключается проблема спарсить json и залить в БД построчно? Там какие-то супер поля с мега-текстами и байтовыми кодами?
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
07.10.2021, 02:42
Единственное что я встречал, это проблема сохранения данных в БД посредством json_encode, когда в сохраняемых данных присутствует UNIX перенос. "Некорректно управляющий символ"
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
07.10.2021, 06:52
Лучший ответ Сообщение было отмечено romanrex как решение

Решение

Чтобы найти отдельную строку надо всё равно прочитать файл с начала.
Можно в БД хранить длины строк и указывать смещение в файловом указателе с помощью https://www.php.net/manual/ru/function.fseek.php
для чтения с нужного места. Но это, пардон, изврат некоторый.

Длинные строки JSON можно упаковывать для базы в gz-архивчики.

Но лучше сменить хостинг на тот, где нет ограничений по объему базы.
1
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
07.10.2021, 15:28  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Сколько именно файлов ожидается? Почему вы считаете это проблемой?
Планируется где-то 3000. Т.е. на сайте есть "продукты", для каждого продукта есть набор графиков. Сейчас большая часть графиков представлена картинками в спрайтах (т.к. отдельно картинками было превышено больше миллиона файлов и это вызвало ограничение хостинга. Пришлось все переделывать в спрайты и сейчас постепенно будет подходить к 100т.). Все эти картинки сейчас будут меняться на построение графиков в canvas, а данные предполагалось хранить в БД, и база резко выросла до 42 ГБ, конечный размер должен был получится под 70 ГБ.

Если каждый txt файл с json будет не объединенным для продукта, а отдельными фалами, то для некоторых продуктов количество файлов увеличится на 4, для других на 100 с лишним. В итоге от проблемы с количеством файлов я не уйду, а снова в нее упрусь.

Хостинг формально "безлимитный", но лимит на одну БД - 5 ГБ. Если у меня будет больше 10 баз, то есть вероятность что и тут "безлимит" на количество будет лимитирован.

Относительно лимита на объем базы объяснили так, БД расположены на скоростных носителях (возможно SSD) и ограничение как таковое свзязано именно с носителями. Т.е. при смене хостинга это ограничение останется актуальным, просто может значение будет на сколько-то выше, но глобально проблема останется.

Добавлено через 58 секунд
Цитата Сообщение от sad67man Посмотреть сообщение
Уточните, в чем заключается проблема спарсить json и залить в БД построчно? Там какие-то супер поля с мега-текстами и байтовыми кодами?
Я не понял вопроса.

Добавлено через 11 минут
Цитата Сообщение от KingdaKa Посмотреть сообщение
Длинные строки JSON можно упаковывать для базы в gz-архивчики.
Попробую об этом узнать подробнее.

Цитата Сообщение от KingdaKa Посмотреть сообщение
Можно в БД хранить длины строк и указывать смещение в файловом указателе с помощью https://www.php.net/manual/ru/function.fseek.php
Да, как вариант, хотя и не хочется вычислять офсеты и длину строки.

Еще видел такой код, где вроде как указывается номер строки. Хотя может я и не правильно понял этот код
PHP
1
2
3
4
5
6
7
8
9
10
$t = -microtime(1);
$file = '../data/1000k.csv';
$spl = new SplFileObject($file);
$spl->seek(999999);
echo $spl->current()
    ."\n".(memory_get_peak_usage(1)/1024/1024)
    ."\n".($t+microtime(1));
//0.5
//0.11500692367554
//Process finished with exit code 0
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
07.10.2021, 15:33
Для 3000 продуктов данные графиков занимают 42 ГБ? Нифига себе графички. Там что за данные-то, координаты каждой точки что ли? Может стоит пересмотреть формат хранения данных вообще?

Добавлено через 4 минуты
Цитата Сообщение от romanrex Посмотреть сообщение
Попробую об этом узнать подробнее.
Вы для начала хотя бы обычным zip или там 7z попробуйте упаковать разные объемы данных и посмотрите эффективность сжатия.
На PHP это функции начинающиеся на gz, можете упаковать все файлы простым скриптиком и заценить.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
07.10.2021, 15:40  [ТС]
Цитата Сообщение от KingdaKa Посмотреть сообщение
Там что за данные-то, координаты каждой точки что ли?
Да, координаты.

Цитата Сообщение от KingdaKa Посмотреть сообщение
Вы для начала хотя бы обычным zip или там 7z попробуйте упаковать разные объемы данных и посмотрите эффективность сжатия.
Где-то из 400 МБ получается 100 МБ.
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
07.10.2021, 15:46
Цитата Сообщение от romanrex Посмотреть сообщение
Да, координаты.
Ну значит надо менять формат хранения и может сокращать количество самих координат (и интерполяцию никто не отменял).

Цитата Сообщение от romanrex Посмотреть сообщение
Где-то из 400 МБ получается 100 МБ.
Неплохо, но как я понимаю проблему не решает.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
07.10.2021, 15:59  [ТС]
Цитата Сообщение от KingdaKa Посмотреть сообщение
Ну значит надо менять формат хранения и может сокращать количество самих координат (и интерполяцию никто не отменял).
Здесь уже все что можно, сделано. Условно 1,5 ГБ уже прорежено до 100 МБ.

Относительно gzip - это в плане хранения напрямую в MySQL или в файле на хостинге, где можно в 1 gzip запаковать сотню файлов и выборочно из архива доставать?
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
07.10.2021, 16:17
Код gzip можно хранить в полях базы данных типа BINARY. Прям для каждого продукта отдельной строкой, например.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
07.10.2021, 16:25
Если мне надо для продуктов загружать какие то данные типа картинок (pdf и так далее).

Я просто создаю поле, которое указывает на нужную папку. И потом, при загрузке на странице, я через glob считаю данные по полю из MySQLi и загружаю всё что хочу.
0
Заблокирован
07.10.2021, 16:45
Цитата Сообщение от romanrex Посмотреть сообщение
Относительно лимита на объем базы объяснили так, БД расположены на скоростных носителях (возможно SSD) и ограничение как таковое свзязано именно с носителями. Т.е. при смене хостинга это ограничение останется актуальным, просто может значение будет на сколько-то выше, но глобально проблема останется.
Ерунда. Есть просто ограничения на дисковое пространство. И хостеру все-равно где ты хранишь данные. В базе или в файлах - это всё один чёрт занимает место в файловой системе. База это тоже файлы. А делать такие костыли, как ты счас пытаешься - только зря тратить своё время.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
07.10.2021, 16:57  [ТС]
Цитата Сообщение от OpXiv Посмотреть сообщение
Я просто создаю поле, которое указывает на нужную папку. И потом, при загрузке на странице, я через glob считаю данные по полю из MySQLi и загружаю всё что хочу.
Примерно так и у меня будет. Единственное, надеялся, что можно будет в качестве ключа использовать номер строки, а не оффсет/длину.

Цитата Сообщение от Camy Посмотреть сообщение
Ерунда. Есть просто ограничения на дисковое пространство. И хостеру все-равно где ты хранишь данные. В базе или в файлах - это всё один чёрт занимает место в файловой системе. База это тоже файлы. А делать такие костыли, как ты счас пытаешься - только зря тратить своё время.
Хостинг не особо следит за своими лимитами, но когда они возникают, приходится вникать, почему они являются проблемой и насколько это будет актуально для других хостингов. Конкретно тут разница в том, что файлы расположены на дисках большого размера и они медленнее, а БД на более мелких и быстрых.
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
07.10.2021, 17:15
Цитата Сообщение от romanrex Посмотреть сообщение
что можно будет в качестве ключа использовать номер строки
По сути, сейчас пройтись по всем записям. Считать все поля json, выгрузить их в папку, если нужно, пронумеровать каждый файл по отдельности(Каждая нумерация, номер строки). И записать на сами продукты все нужные данные к этим файлам.
0
Заблокирован
07.10.2021, 17:20
Цитата Сообщение от romanrex Посмотреть сообщение
Конкретно тут разница в том, что файлы расположены на дисках большого размера и они медленнее, а БД на более мелких и быстрых.
Да это я понял. Я сказал ерунда по поводу того, что на других хостингах будет тоже самое. Можно вообще заказывать в облаке определенные ресурсы. Делай там что хочешь. Ставь любою Ось. Устанавливай веб-сервер и так далее. Ограничен только выделенными ресурсами. Память, кол-во ядер процессора и дисковое пространство. Ну или найти другой хостинг.
0
-8 / 1 / 2
Регистрация: 04.01.2009
Сообщений: 121
08.10.2021, 17:54  [ТС]
В целом все оказалось не так и сложно. Единственное, т.к. исходные файлы генерируются в C# в декстопе, пришлось повозится с поправками на метку BOM (от которой уйти никак) и увеличением длины из-за возможно символа переноса строки Environment.NewLine. Т.е. на начальный стартовый offset значение 3, и далее каждая длина +1. Определение длин и офсетов через sb_data.Length.

По скорости подгрузки данных, вроде не сильно отличается от того, что загружается из БД.


Ниже проверочный код для опеределенного id продукта. Для удобства отладки поправок, выводятся первые 100 символов и последние 100 символов от подгружаемого поля для визуального контроля.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$id=526;
 
$name_table="x_".$id;
echo $name_table."<br>";
$t = -microtime(1);
$result1= mysql_query("select param, data from $name_table WHERE rw='30' OR rw='35' ", $dbh2);
while ($row0 = mysql_fetch_array($result1))
{
    $data_json = $row0['data'];
    $param_json = $row0['param'];
    $data_hp = json_decode($data_json);
    $param = json_decode($param_json, true);
    if (count($data_hp)==1)
    {
        //echo "FILE<br>";
        //считывваем файл
        $filename="../x/".$id."/x_".$id.".txt";
        $ll=3; //поправка BOM
        $offset_file=$param['offset_file']+$ll;
        $lenght_file= $param['lenght_file']+1;
 
        echo $offset_file."<br>";
        echo  $lenght_file."<br>"; 
        
        $lenght_file= 100;
        echo "<br>";
        
        $fp = fopen($filename, 'r') or die('Could not open file');;
        fseek($fp, $offset_file);
        $data = fgets($fp, $lenght_file); 
 
        echo $data; 
        echo "<br>";
 
        $offset_file2=$param['offset_file']+$param['lenght_file']-100+$ll;
        $lenght_file2= 101;
        fseek($fp, $offset_file2);
        $data2 = fgets($fp, $lenght_file2);
        echo $data2; //
     
        echo "<br>";
        echo "<br>";
    }
    else
    {
        echo "NOFILE<br>";
    }
}
0
193 / 140 / 36
Регистрация: 19.11.2020
Сообщений: 881
08.10.2021, 21:03
Это как лужу вычерпывать вилами.
0
Заблокирован
08.10.2021, 21:43
Цитата Сообщение от romanrex Посмотреть сообщение
По скорости подгрузки данных, вроде не сильно отличается от того, что загружается из БД.
Заметно будет при хорошей посещаемости.
Цитата Сообщение от romanrex Посмотреть сообщение
mysql_query
Какая ж версия php на сервере? Наверное, с нулевых не менялось ничего
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2021, 21:43
Помогаю со студенческими работами здесь

Чтение большого файла в нескольких потоках
Здравствуйте, товарищи! недавно начал изучать многопоточность в C#. заинтересовался такой темой как чтение и обработка большого файла...

Чтение и запись строк большого файла
Привет. Есть большой (150к коротких строк) текстовый файл, нужно после некоторых строк в нём добавить по несколько новых строк. ...

Чтение бинарного файла большого объема (300 Гб)
Добрый день, Мне необходимо считывать каждые 996-1000 байты формата int из файла объемом 300 Гигабайт и делать так пока не достигну...

Максимально быстрое чтение очень большого файла
Добрый день, задача прочитать очень большой файл (1GB-10GB+). Нужно провести операцию с каждой строкой этого файла. Используя...

Быстрое чтение большого файла. Зависает процесс
Всем доброго времени суток. Есть задача прочитать файл(1-20 мб), который состоит из слов разделённых пробелами для того, чтобы переписать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru