Учитывая, что у меня есть 100-кратный txt-файл, содержащий миллионы строк текста. Как я могу прочитать этот текстовый файл блоком строк с помощью PHP?
Я не могу использовать file_get_contents();
потому что файл слишком велик. fgets()
также читает текстовую строку за строкой, которая, вероятно, займет больше времени, чтобы закончить чтение всего файла.
Если я буду использовать fread($fp,5030)
где «5030» – это некоторое значение длины, для которого оно должно быть прочитано. Будет ли случай, когда он не будет читать всю строку (например, остановка в середине строки), потому что она достигла максимальной длины?
Я не могу использовать file_get_contents (); потому что файл слишком велик. fgets () также читает текстовую строку за строкой, которая, вероятно, займет больше времени, чтобы закончить чтение всего файла.
Не видите, почему вы не можете использовать fgets()
$blocksize = 50; // in "number of lines" while (!feof($fh)) { $lines = array(); $count = 0; while (!feof($fh) && (++$count <= $blocksize)) { $lines[] = fgets($fh); } doSomethingWithLines($lines); }
Чтение 100 ГБ займет время.
Подход, основанный на подходе, звучит как разумное решение. Вы можете определить, достигли ли вы конца строки, проверяя, является ли последний символ в строке символом новой строки ( '\n'
). Если это не так, вы можете прочитать еще несколько символов и добавить их в свою существующую строку, или вы можете обрезать символы с вашей строки до последней строки новой строки, а затем использовать fseek
для настройки вашей позиции в файле.
Боковой момент: знаете ли вы, что чтение 100-Гбайт-файла займет очень много времени?
я думаю, что вам нужно использовать fread ($ fp, somesize) и проверить вручную, если вы основали конец строки, иначе читаете другой кусок.
Надеюсь это поможет.
Я бы рекомендовал реализовать чтение одной строки внутри функции, скрывая детали реализации этого конкретного шага от остальной части вашего кода – функции обработки не волнует, как была получена строка. Затем вы можете реализовать свою первую версию с помощью fgets()
а затем попробовать другие методы, если заметите, что она слишком медленная. Вполне возможно, что первоначальная реализация слишком медленная, но дело в том, что вы не узнаете, пока не проведете сравнительный анализ.
Я знаю, что это старый вопрос, но я думаю, что есть ценность для нового ответа для тех, кто в конечном итоге находит этот вопрос.
Я согласен с тем, что чтение 100 ГБ требует времени, и поэтому я также соглашаюсь с тем, что нам нужно найти наиболее эффективный вариант для его чтения, чтобы он был как можно меньше, а просто думал: «Кто волнует, сколько это стоит, если уже много ", так что давайте узнаем о нашем минимальном возможном времени.
Используйте fread для чтения кеша этих данных
Чтение строки за строкой из кэша до конца кэша или конца найденных данных
Возьмите необработанную последнюю часть фрагмента (тот, который вы искали разделитель строки), и переместите его спереди, затем прочитайте кусок размера, который вы определили, за вычетом размера необработанных данных и поместите его сразу после этого un обработанный кусок, тогда, там вы идете, у вас есть новый полный кусок.
Повторите чтение по строке и этот процесс, пока файл не будет прочитан полностью.
Вы должны использовать кусок кеша больше, чем любой ожидаемый размер строки.
Чем больше размер кеша, тем быстрее вы читаете, тем больше памяти вы используете.