Ich habe eine Reihe von gzip-Dateien, die ich ab und zu in bzip2 konvertieren muss. Derzeit verwende ich ein Shell-Skript, das einfach jede Datei "gunzip" und dann "bzip2" verwendet. Obwohl dies funktioniert, dauert es eine Menge Zeit , um vollständig.
Ist es möglich, diesen Prozess effizienter zu gestalten? Ich bin bereit, einen Tauchgang zu machen und bei Bedarf die Quellcodes von gunzip und bzip2 zu untersuchen, aber ich möchte nur sicher sein, dass sich das auszahlt. Gibt es Hoffnung, die Effizienz des Prozesses zu verbessern?
quelle
pbzip2
Erwähnung. Falls der Link für niemanden geladen wird, finden Sie hier die Projektseite und die Manpage .Anstatt gunzip in einem Schritt und bzip2 in einem anderen, frage ich mich, ob es vielleicht effizienter wäre, Pipes zu verwenden. Etwas wie
gunzip --to-stdout foo.gz | bzip2 > foo.bz2
Ich denke mit zwei oder mehr CPUs wäre dies definitiv schneller. Aber vielleicht sogar mit nur einem Kern. Ich gebe schändlicherweise zu, dies nicht ausprobiert zu haben.
quelle
bzip2
undgzip
nicht parallel arbeiten intern durch ein Rohr verwenden , können Sie sie parallel arbeiten, weil ein Rohr implizit zwei Prozesse gestartet, die wird parallel laufen. Zumindest Dekomprimierung und Komprimierung werden also parallel ausgeführt.bzip2
die CPU-Auslastunggunzip
diejenige in den Schatten, sodass in der Praxis die Parallelität, die Sie hier erhalten, minimal ist. Es ist trotzdem schön, keine Festplatten-E / A ausführen zu müssen!GNU parallel ( http://www.gnu.org/software/parallel ) kann eine Option sein, wenn Sie mehrere Kerne (oder sogar mehrere Computer) haben:
Lesen Sie das Tutorial / die Manpage für Details und Optionen.
quelle
Was Sie gerade tun, ist Ihre beste Wahl. Es ist kein Konvertierungstool verfügbar, und der Versuch, eine bereits komprimierte Datei zu bzip2, ist keine Option, da dies häufig unerwünschte Auswirkungen hat. Da der Algorithmus unterschiedlich ist, würde das Konvertieren das Abrufen der Originaldaten unabhängig davon beinhalten. Es sei denn natürlich, GZIP war ein Schritt im bzip2-Prozess, in dem dies leider nicht der Fall ist.
quelle
gzip
verwendet Leimpel-Ziv 77, währendbzip2
Burrows-Wheeler verwendet wird. Ich fürchte, verschiedene Algorithmen.Gelegentlich muss ich dasselbe mit Protokolldateien tun. Ich beginne mit den kleinsten * .gz-Dateien zuerst (
ls -rS
), gunzip und dann und bzip2 sie einzeln. Ich weiß nicht, ob es möglich ist, die gunzip-Ausgabe direkt auf die bzip2-Eingabe zu lenken. Der Befehl bzip2 ist beim Komprimieren so viel langsamer als der Befehl gunzip beim Dekomprimieren, dass er möglicherweise den Speicher belegt und Speicherplatz auf dem Host austauscht.Verbesserungen oder Vorschläge sind willkommen. Hier ist mein Einzeiler:
quelle
Wenn Sie mehr als ein paar haben, lesen Sie den LJ-Artikel mit einem schönen Shell-Skript.
http://linuxgazette.net/123/bechtel.html
7zip erhält eine bessere Komprimierung und ist multithreaded.
quelle
Musste das erst vor ein paar Minuten machen:
Wo
rezip
würde definiert werden als:Optional können Sie es auch mithilfe einer
-P
Option mit Multithreadingxargs
erstellen, aber seien Sie vorsichtig mit dieser Option . (Fangen Sie niedrig an!)quelle