Ich habe es herausgefunden:
Der Grund dafür ist, dass gzip
(in Bezug auf die CPU-Geschwindigkeit im Vergleich zur HD-Suchgeschwindigkeit heutzutage) extrem niedrige Puffergrößen verwendet werden .
Es liest einige KB aus der Eingabedatei, komprimiert sie und leert sie in die Ausgabedatei. Angesichts der Tatsache, dass dies eine Festplattensuche erfordert, können nur wenige Vorgänge pro Sekunde ausgeführt werden.
Der Grund, warum meine Leistung nicht skaliert wurde, ist, dass man schon gzip
wie verrückt gesucht hat.
Ich habe dies mit dem Unix- buffer
Dienstprogramm umgangen :
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Durch Puffern vieler Eingaben vor dem Senden an gzip kann die Anzahl kleiner Suchvorgänge drastisch reduziert werden. Die Optionen:
-s
und -m
sollen die Größe des Puffers angeben (ich glaube, es ist in KB, aber nicht sicher)
-p 100
stellt sicher, dass die Daten erst an gzip übergeben werden, wenn der Puffer zu 100% gefüllt ist
Wenn vier davon parallel ausgeführt werden, kann ich erwartungsgemäß einen Durchsatz von 4 * 25 MB / s erzielen.
Ich frage mich immer noch, warum gzip es nicht erlaubt, die Puffergröße zu erhöhen - auf diese Weise ist es ziemlich nutzlos, wenn es auf einer sich drehenden Festplatte ausgeführt wird.
EDIT : Ich habe ein paar weitere Komprimierungsprogramme ausprobiert:
bzip2
verarbeitet aufgrund der stärkeren / CPU-intensiveren Komprimierung nur 2 MB / s
lzop
scheint größere Puffer zuzulassen: 70 MB / s pro Kern und 2 Kerne können meine HD maximieren, ohne zu viel zu suchen
dd
das auch?