Удалить первые X строк из файла PHP - PullRequest
7 голосов
/ 26 марта 2012

Мне было интересно, знает ли кто-нибудь, как это можно сделать в PHP. Я запускаю скрипт, который включает в себя открытие файла, взятие первых 1000 строк, выполнение некоторых вещей с этими строками, затем php-файл открывает другой экземпляр самого себя, чтобы взять следующие тысячи строк и так далее, пока не достигнет конца файла , Я использую объект splfile, так что я могу искать определенную строку, что позволяет мне довольно хорошо разбить ее на 1000 строк. Самая большая проблема, с которой я столкнулся, связана с производительностью. Я имею дело с файлами, которые содержат более 10000000 строк, и хотя первые 10000 строк или около того он делает довольно быстро, после этого момента наблюдается значительное экспоненциальное замедление, которое, я думаю, просто требует поиска к этой точке.

Что я хотел бы сделать, это прочитать первую тысячу строк, а затем просто удалить их из файла, чтобы мой сценарий всегда читал первые тысячи строк. Есть ли способ сделать это без чтения остальной части файла в память. Другие решения, которые я видел, включают чтение каждой строки в массиве, а затем избавление от первых X записей, но с десятью миллионами строк, которые потребляют слишком много памяти и времени.

Если у кого-то есть решение или другие предложения, которые бы ускорили работу, это будет с благодарностью.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Мне кажется, что цель состоит в том, чтобы проанализировать огромное количество данных и вставить их в базу данных?Если это так, я не понимаю, почему так важно работать ровно с 1000 строками?

Я думаю, что просто подхожу к этому, считывая большой кусок данных, скажем, 1 МБ, в память сразу, а затем сканируюназад от конца фрагмента в памяти для последнего конца строки.Получив это, я могу сохранить положение файла и дополнительные данные, которые у меня есть (что осталось от последней строки, заканчивающейся до конца фрагмента).В качестве альтернативы просто сбросьте указатель на файл с помощью fseek (), чтобы в том месте, где в файле, где я нашел окончание последней строки, легко выполнить это с помощью strlen ($ chunk).

Таким образом, все, что мне нужно сделать, это взорватьchunk, выполнив explode ("\ r \ n", $ chunk), и у меня есть все необходимые строки в достаточно большом блоке для дальнейшей обработки.

Удаление строк из начала файла не рекомендуется.,Это будет перетасовывать огромное количество данных назад и вперед на диск.

1 голос
/ 26 марта 2012

К сожалению, реального решения этой проблемы не существует, поскольку файлы всегда полностью загружаются в основную память до того, как они будут прочитаны.

Тем не менее, я опубликовал этот ответ, потому что это возможное решение, но я подозреваю, что оно вряд ли улучшает производительность. Поправь меня, если я ошибаюсь.

Вы можете использовать XML, чтобы разделить файлы на 1000 строк. И использовать DomDocument Class of PHP для извлечения и добавления данных. Вы можете добавить дочерний элемент, когда хотите добавить данные и получить первый дочерний элемент, чтобы получить первую тысячу строк, и удалить его, если хотите. Просто так:

<document>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    .
    .
    .
</document>

ДРУГОЙ ПУТЬ:

Если вы действительно уверены в том, что разделите разделы на ровно 1000 строк, почему бы вам не сохранить их в базе данных, где каждая 1000 в отдельной строке? Делая это, вы, несомненно, сократите накладные расходы на чтение и запись файла и улучшите производительность.

...