В Python (по крайней мере <= 2.6.x) синтаксический анализ формата gzip реализован в Python (поверх zlib). Более того, он, кажется, делает некоторые странные вещи, а именно, распаковывает <strong>до конца файла в память, а затем отбрасывает все, что превышает запрошенный размер чтения (затем повторите это для следующего чтения). ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Я только что посмотрел на gzip.read()
в течение 3 минут, поэтому я могу ошибаться здесь. Независимо от того, правильно ли я понимаю gzip.read (), модуль gzip не оптимизирован для больших объемов данных. Попробуйте сделать то же самое, что и в Perl, то есть запустить внешний процесс (например, см. Модуль subprocess
).
EDIT
На самом деле, я пропустил замечание ОП о том, что ввод / вывод в обычном файле такой же медленный, как сжатый (спасибо ire_and_curses за указание на это). Это показалось мне маловероятным, поэтому я сделал некоторые измерения ...
from timeit import Timer
def w(n):
L = "*"*80+"\n"
with open("ttt", "w") as f:
for i in xrange(n) :
f.write(L)
def r():
with open("ttt", "r") as f:
for n,line in enumerate(f) :
if n % 1000000 == 0 :
print n
def g():
f = gzip.open("ttt.gz", "r")
for n,line in enumerate(f) :
if n % 1000000 == 0 :
print n
Теперь, запустив его ...
>>> Timer("w(10000000)", "from __main__ import w").timeit(1)
14.153118133544922
>>> Timer("r()", "from __main__ import r").timeit(1)
1.6482770442962646
# here i switched to a terminal and made ttt.gz from ttt
>>> Timer("g()", "from __main__ import g").timeit(1)
... и после перерыва на чай и обнаружения, что он все еще работает, я убил его, извините. Затем я попробовал 100'000 строк вместо 10'000'000:
>>> Timer("w(100000)", "from __main__ import w").timeit(1)
0.05810999870300293
>>> Timer("r()", "from __main__ import r").timeit(1)
0.09662318229675293
# here i switched to a terminal and made ttt.gz from ttt
>>> Timer("g()", "from __main__ import g").timeit(1)
11.939290046691895
Время модуля gzip равно O (file_size ** 2), поэтому с числом строк порядка миллионов время чтения gzip не может быть таким же, как и время обычного чтения (как мы видим, подтверждается экспериментом). Анонимлемминг, пожалуйста, проверьте еще раз.