Основы в том, что мне нужно обрабатывать текстовые файлы 4gig для каждой строки.
используя.readline() или для строки в f отлично подходит для памяти, но занимает много времени до ввода-вывода. Хотелось бы использовать что-то вроде урожая, но это (я думаю) будет рубить линии.
ВАРИАНТ ОТВЕТА:
file.readlines([sizehint])¶
Read until EOF using readline() and return a list containing the lines
таким образом, читать. Если присутствует необязательный аргумент sizehint, вместо чтения до EOF, считываются целые строки, содержащие приблизительно размерные байты (возможно, после округления до размера внутреннего буфера). Объекты, реализующие файловый интерфейс, могут игнорировать параметр sizehint, если он не может быть реализован или не может быть эффективно реализован.
Не понимал, что ты мог это сделать!
Вы можете просто перебирать файл-объект:
with open("filename") as f:
for line in f:
whatever
Это позволит сделать внутреннюю буферизацию для повышения производительности. (Обратите внимание, что file.readline()
будет работать значительно хуже, потому что он не буферизуется - поэтому вы не можете смешивать итерацию по файловому объекту с file.readline()
.)
file.readline()
ведет себя совершенно иначе, чем итерация по файлу. Итерации сделают буферизацию для вас и не должны создавать узкое место в производительности.
Вы всегда могли бы выровнять линии? Я имею в виду, почему вы открываете один файл и повторяете весь путь, когда вы можете открыть один и тот же файл 6 раз и перебрать. например
a #is the first 1024 bytes
b #is the next 1024
#etcetc
f #is the last 1024 bytes
Каждый дескриптор файла работает в отдельном процессе, и мы начинаем готовить на газе. Не забудьте правильно разобраться с концами строк.
Если вы хотите что-то сделать на основе строки, вы можете просто перебрать объект файла:
f = open("w00t.txt")
for line in f:
# do stuff
Тем не менее, делать вещи на основе каждой строки может быть фактическим узким местом производительности, поэтому, возможно, вы должны использовать лучший размер куска? Что вы можете сделать, например, прочитать 4096 байт, найти последнюю строку, завершающую \n
, обработать в этой части и дополнить часть, оставшуюся до следующего фрагмента.