Я пытаюсь лучше понять, как обрабатывать файлы с миллионами записей при минимальном использовании памяти.
На практике я создал файл с ~ 6,5 миллионами строк и написал пару функций, чтобы разбить его на ~ 7 файлов по миллиону строк в каждом.В первой функции я использовал метод чтения файла python, чтобы создать логику так, чтобы новый файл создавался после считывания 1 миллиона строк, пока мы не дойдем до последнего файла, в который записаны оставшиеся 500К строк.
Тофункция запускается навсегда.
Затем я создал другую функцию для разделения файла с помощью itertools.islice.Это заняло чуть менее ~ 2 секунд, чтобы бежать.
Теперь я знаю, что islice - это итератор, который выполняет итерации файлового объекта, поэтому ожидается, что он будет более эффективным в использовании памяти.Однако чем он отличается от метода read ()?
Я думал, что даже read () проходит каждую строку в файле одну за другой (вроде как итератор ...).Итак, я ожидал, что производительность двух программ будет одинаковой.Не могли бы вы, ребята, помочь мне понять, почему islice НАМНОГО быстрее?
Вот оба фрагмента кода -
1 с использованием read () -
with open("bigfile.txt","r") as f:
filenum = 1
j = 1
for i, line in enumerate(f):
if j <= 1000000:
with open("big_out_%d" % filenum, "a") as outfile:
outfile.write(line)
j += 1
if j == 1000000:
j = 1
filenum += 1
with open("big_out_%d" % filenum, "a") as outfile:
outfile.write(line)
2 с использованием islice-
import itertools
import time
start = time.time()
with open("bigfile.txt","r") as f:
i = 1
while True:
chunk = list(itertools.islice(f, 1000000))
if not chunk:
print "reached the end"
break
with open("out%d.txt" % i, "w") as out:
out.writelines(chunk)
print i
i += 1
end = time.time()
print "time is %d" % ((end-start))