Die gzip-Bibliothek verwendet (offensichtlich) gzip
, was etwas langsam sein kann. Sie können die Dinge mit einem Systemaufruf an pigz , der parallelisierten Version von , beschleunigengzip
. Die Nachteile sind, dass Sie installieren müssen pigz
und es während des Laufs mehr Kerne benötigt, aber es ist viel schneller und nicht speicherintensiver. Der Aufruf der Datei wird dann os.popen('pigz -dc ' + filename)
statt gzip.open(filename,'rt')
. Die Pigz-Flags dienen -d
zur Dekomprimierung und -c
zur Standardausgabe, die dann abgerufen werden können os.popen
.
Der folgende Code nimmt eine Datei und eine Nummer (1 oder 2) auf und zählt die Anzahl der Zeilen in der Datei mit den verschiedenen Aufrufen, während die Zeit gemessen wird, die der Code benötigt. Definieren Sie den folgenden Code in unzip-file.py
:
import os
import sys
import time
import gzip
def local_unzip(obj):
t0 = time.time()
count = 0
with obj as f:
for line in f:
count += 1
print(time.time() - t0, count)
r = sys.argv[1]
if sys.argv[2] == "1":
local_unzip(gzip.open(r,'rt'))
else:
local_unzip(os.popen('pigz -dc ' + r))
Der Aufruf dieser mit , /usr/bin/time -f %M
welche Maßnahmen die maximale Speichernutzung des Prozesses auf einer 28G - Datei erhalten wir:
$ /usr/bin/time -f %M ./unzip-file.py $file 1
(3037.2604110240936, 1223422024)
5116
$ /usr/bin/time -f %M ./unzip-file.py $file 2
(598.771901845932, 1223422024)
4996
Dies zeigt, dass der Systemaufruf etwa fünfmal schneller ist (10 Minuten im Vergleich zu 50 Minuten), wenn im Grunde derselbe maximale Speicher verwendet wird. Es ist auch erwähnenswert, dass je nachdem, was Sie pro Zeile tun, das Lesen in der Datei möglicherweise nicht der begrenzende Faktor ist. In diesem Fall spielt die von Ihnen gewählte Option keine Rolle.