Обработка больших текстовых файлов в Python

1

Основы в том, что мне нужно обрабатывать текстовые файлы 4gig для каждой строки.

используя.readline() или для строки в f отлично подходит для памяти, но занимает много времени до ввода-вывода. Хотелось бы использовать что-то вроде урожая, но это (я думаю) будет рубить линии.

ВАРИАНТ ОТВЕТА:

file.readlines([sizehint])¶
Read until EOF using readline() and return a list containing the lines

таким образом, читать. Если присутствует необязательный аргумент sizehint, вместо чтения до EOF, считываются целые строки, содержащие приблизительно размерные байты (возможно, после округления до размера внутреннего буфера). Объекты, реализующие файловый интерфейс, могут игнорировать параметр sizehint, если он не может быть реализован или не может быть эффективно реализован.

Не понимал, что ты мог это сделать!

  • 0
    вы анализируете файлы журналов? Тогда не надо. Есть библиотеки, которые сделают это лучше.
  • 0
    nananananananananananananana итераторы! (Бэтмен тема, кстати)
Показать ещё 1 комментарий
Теги:

3 ответа

7

Вы можете просто перебирать файл-объект:

with open("filename") as f:
    for line in f:
        whatever

Это позволит сделать внутреннюю буферизацию для повышения производительности. (Обратите внимание, что file.readline() будет работать значительно хуже, потому что он не буферизуется - поэтому вы не можете смешивать итерацию по файловому объекту с file.readline().)

  • 0
    Это то, что я имел в виду, используя .readline (), делая это так хорошо с памятью, но занимает много времени.
  • 0
    @jdborg: file.readline() ведет себя совершенно иначе, чем итерация по файлу. Итерации сделают буферизацию для вас и не должны создавать узкое место в производительности.
0

Вы всегда могли бы выровнять линии? Я имею в виду, почему вы открываете один файл и повторяете весь путь, когда вы можете открыть один и тот же файл 6 раз и перебрать. например

a #is the first 1024 bytes
b #is the next 1024
#etcetc
f #is the last 1024 bytes

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

0

Если вы хотите что-то сделать на основе строки, вы можете просто перебрать объект файла:

f = open("w00t.txt")
for line in f:
    # do stuff

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

  • 0
    Это то, что я имел в виду, используя .readline (), делая это так хорошо с памятью, но занимает много времени.
  • 0
    @jdborg: прочитайте вторую часть моего ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню