Я нахожусь в процессе переписывания некоторых скриптов для анализа сгенерированных машиной журналов с perl на php. Размер файлов варьируется от 20 МБ до 400 МБ. Я сталкиваюсь с этой проблемой, чтобы решить, следует ли мне использовать комбинацию file () или fopen () + fgets (). через файл для более быстрой работы.
Вот базовое прохождение, я проверяю размер файла перед его открытием, и если файл больше 100 МБ (довольно редкий случай, но время от времени случается), я пойду по маршруту fopen + fgets, так как я только наткнулся на ограничение памяти для сценария до 384 МБ, любой файл размером более 100 МБ может вызвать фатальную ошибку. В противном случае я использую файл().
Я просматриваю файл только один раз от начала до конца в обоих методах, построчно.
Вот вопрос, стоит ли сохранять часть кода file() для работы с небольшими файлами? Я не знаю, как именно file() (я также использую опцию SKIP_EMPTY_LINE) работает в php, он отображает файл в память напрямую или построчно пихает в память, проходя через него? Я провел на нем несколько тестов, производительность довольно близка, средняя разница составляет около 0,1 с для файла размером 40 МБ, а file() имеет преимущество перед fopen + fgets примерно в 80% случаев (из 200 тестов на одном и том же наборе файлов).
Удаление файловой части может сэкономить мне часть памяти из системы, и, учитывая, что у меня одновременно запущено 3 экземпляра одного и того же скрипта, это может сэкономить мне 1 ГБ памяти в системе 12 ГБ, в которой также размещена база данных и другие дерьмо. Но я также не хочу снижать производительность скрипта, поскольку в день поступает около 10 000 таких журналов, разница в 0,1 с на самом деле складывается.
Любое предложение поможет и TIA!