Dekomprimieren Sie nur einen bestimmten BZIP2 -Block
-
19-09-2019 - |
Frage
Sagen Sie, ich habe eine BZIP2 -Datei (über 5 GB) und möchte nur Block #x dekomprimieren, da es dort ist, wo meine Daten sind (Block ist jedes Mal anders). Wie würde ich das machen?
Ich habe darüber nachgedacht, einen Index zu machen, wo sich alle Blöcke befinden, und dann den Block, den ich benötige, aus der Datei ausschneide und bZIP2Recover darauf anwenden.
Ich habe auch über Komprimieren von 1 MB nach dem anderen nachgedacht, diese dann an eine Datei angemeldet (und den Speicherort aufzeichnen) und einfach die Datei greifen, wenn ich sie brauche, aber ich würde lieber die ursprüngliche BZIP2 -Datei intakt halten.
Meine bevorzugte Sprache ist Ruby, aber für mich ist die Lösung einer Sprache in Ordnung (solange ich das Prinzip verstehe).
Lösung
Da ist ein http://bitbucket.org/james_taylor/seek-bzip2
Schnapp dir die Quelle, kompiliere sie.
Rennen mit
./seek-bzip2 32 < bzip_compressed.bz2
zu testen.
Der einzige Param ist die Bit -Verschiebung des gewundten Blockheaders. Sie können es erhalten, wenn Sie eine "31 41 59 26 53 59" -Hex -Zeichenfolge in der Binärdatei finden. Das war falsch. Der Blockstart kann nicht auf die Byte -Grenze ausgerichtet sein. Sie sollten daher nach möglichen Bitverschiebungen von "31 41 59 26 53 59" -Hex -Zeichenfolge suchen, wie es in BZIP2Recover geschaltet wird - http://www.bzip.org/1.0.3/html/recovering.html
32 ist eine Bitgröße des "Bzh1" -Headers, bei dem 1 jede Ziffer von "1" bis "9" (in klassischem BZIP2) sein kann - es ist eine (unkomprimierte) Blockgröße in Hunderten von KB (nicht genau).
Andere Tipps
Es ist wahr, dass BZIP-Tisch fast so langsam ist wie die Dekomprimierung, aber Sie müssen es natürlich nur einmal tun und Sie können die Ausgabe auf eine Art und Weise speichern, um sie als Index zu verwenden. Dies ist perfekt für das, was ich brauche, aber möglicherweise nicht das ist, was jeder braucht.
Ich brauchte ein wenig Hilfe, um es unter Windows zu kompilieren.