2008-11-05 3 views
2

Мне нужно прочитать CSV-файлы по строкам, которые могут быть от 10 до 20 мегабайт. file() бесполезен ;-), и я должен найти самый быстрый способ.Лучший способ чтения больших файлов в PHP?

Я попытался с fgets(), который работает нормально, но я не знаю, читает ли он маленький блок каждый раз, когда я его вызываю, или если он кэширует большую и оптимизирует ввод/вывод файлов. Должен ли я попробовать метод fread(), самостоятельно разобрав EOL?

Благодаря Седрик

ответ

7

Вы должны использовать fgetcsv(), если это возможно.

В противном случае всегда есть fgets().

1

fgets() должно быть прекрасно для ваших нужд. Даже file() должно быть в порядке - 20mb не очень большой, если вы делаете это много раз одновременно.

Не забывайте, что вы можете настроить fgets() со своим вторым параметром.

+0

Настройка PHP по умолчанию позволяет использовать максимальную память 8 МБ на процесс. В этом случае 20Mb большой. (Я знаю, что вы можете это изменить, но есть очевидные причины, почему вы не захотите). – 2008-11-05 13:47:17

0

Вы должны взглянуть на fgetcsv(), он автоматически анализирует разделенную линию комы в массив.

Что касается эффективности работы, я понятия не имею. Вам нужно будет выполнить быстрый тест, желательно с файлом размера, который вы ожидаете обработать позже. Но я был бы удивлен, если бы fget ??? и fput ??? функции не были оптимизированы I/O.

2

stream_get_line, по-видимому, более эффективен, чем fgets для больших файлов. Если вы укажете разумную максимальную длину для чтения, я не вижу причин, по которым PHP должен был бы «читать дальше», чтобы читать строку, поскольку вы, кажется, беспокоитесь.

Если вы хотите использовать CSV, то fgetcsv вернет результаты в чуть более разумный формат.