Frage

Ich versuche, über 8000 Dateien in gzip-Format in Java zu dekomprimieren. Mein erster Versuch war GZIPInputStream zu verwenden, aber die Leistung war schrecklich.

Wer weiß, eine Alternative zu gzip Archive zu entpacken? Ich habe versucht, ZipInputStream aber es ist nicht das gzip-Format zu erkennen.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie müssen Pufferung verwenden. Schreiben kleine Stücke von Daten wird zu ineffizient sein. Die Kompression Implementierung ist in nativen Code in dem Sun JDK. Auch wenn es in der Regel nicht die gepufferte Leistung ist angemessen Datei oder Netzwerk nicht überschreiten sollte I / O.

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

Als native Code verwendet wird, um den Dekompression / Kompressions-Algorithmus zu implementieren, sehr vorsichtig sein, um den Strom (und nicht nur den zugrunde liegenden Stream) nach Gebrauch zu schließen. Ich habe gefunden zu haben Lasten von `Deflaters' rumhängen ist sehr schlecht für die Leistung.

ZipInputStream beschäftigt sich mit Archiven von Dateien, die aus Komprimieren eines Stroms eine ganz andere Sache ist.

Andere Tipps

Wenn Sie sagen, dass GZipInputStream Leistung war schrecklich, könnten Sie das konkretisieren? Haben Sie herausfinden, ob es sich um eine CPU-Engpass oder eine I / O-Engpass war? Wurden unter Verwendung von Ihnen Pufferung sowohl am Eingang und Ausgang? Wenn Sie den Code schreiben könnten Sie verwendet haben, das wäre sehr hilfreich.

Wenn Sie auf einer Multi-Core-Maschine sind, können Sie immer noch mit GZipInputStream versuchen aber mehrere Threads verwendet werden, einen pro Kern, mit einer gemeinsamen Warteschlange von Dateien noch zu verarbeiten. (Jede Datei würde nur von einem einzigen Thread verarbeitet werden.) Die kann alles noch schlimmer machen, wenn Sie I / O gebunden, aber es kann einen Versuch wert sein.

Für diese Art von Maßstab, können Sie native gehen, vorausgesetzt, Ihre Plattform Anforderungen begrenzt sind. Sie können JNI verwenden, um eine Bibliothek zu rufen oder einen nativen Befehl ProcessBuilder aufzurufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top