Schlechte Performance der Java-Unzip-Utilities

8

Ich habe festgestellt, dass die Unzip-Funktion in Java extrem langsam ist, verglichen mit der Verwendung eines nativen Tools wie WinZip.

Gibt es eine Drittanbieter-Bibliothek für Java, die effizienter ist? Open Source wird bevorzugt.

Bearbeiten

Hier ist ein Geschwindigkeitsvergleich mit der Java-basierten Lösung vs 7zip. Ich habe gepufferte Input / Output-Streams in meiner ursprünglichen Lösung hinzugefügt (danke Jim, das hat einen großen Unterschied gemacht).

Zip Dateigröße: 800K Java-Lösung: 2,7 Sekunden 7Zip-Lösung: 204 ms

Hier ist der modifizierte Code, der die eingebaute Java-Dekomprimierung verwendet:

%Vor%     
Tony 23.07.2010, 19:49
quelle

3 Antworten

20

Das Problem ist nicht das Entpacken, es ist die ineffiziente Art, die entpackten Daten zurück auf die Festplatte zu schreiben. Meine Benchmarks zeigen, dass mit

%Vor%

reduziert stattdessen die Ausführungszeit der Methode um den Faktor 5 (von 5 auf 1 Sekunde für eine 6-MB-Zip-Datei).

Der wahrscheinlichste Schuldige ist die Verwendung von bis.available() . Abgesehen davon, dass es falsch ist (verfügbar gibt die Anzahl der Bytes zurück, bis ein Aufruf zum Lesen blockiert wird, nicht bis zum Ende des Streams), umgeht dies die von BufferedInputStream bereitgestellte Pufferung, was einen nativen Systemaufruf für jedes in die Ausgabedatei kopierte Byte erfordert.

Beachten Sie, dass das Umbrechen in einen BufferedStream nicht erforderlich ist, wenn Sie wie oben die Massenlese- und -schreibmethoden verwenden und der Code zum Schließen der Ressourcen nicht ausnahmesicher ist (wenn Lesen oder Schreiben aus irgendeinem Grund fehlschlägt, weder is oder os wäre geschlossen). Schließlich, wenn Sie IOUtils im Klassenpfad haben, empfehle ich die Verwendung ihrer gut getesteten IOUtils.copy statt Ihre eigenen zu rollen.

    
meriton 25.07.2010 12:17
quelle
3

Stellen Sie sicher, dass Sie die unzip-Methode in Ihrer Java-Anwendung mit einem BufferedInputStream füttern. Wenn Sie den Fehler gemacht haben, einen ungepufferten Eingabestrom zu verwenden, ist Ihre E / A-Leistung garantiert lächerlich.

    
Jim Tough 23.07.2010 23:30
quelle
-1

Ich habe eine "unelegante" Lösung gefunden. Es gibt ein Open-Source-Programm 7zip (www.7-zip.org), das kostenlos verwendet werden kann. Sie können die Befehlszeilenversion herunterladen ( Ссылка ). 7-zip wird nur unter Windows unterstützt, aber es sieht so aus, als wäre es auf andere Plattformen (p7zip) portiert worden.

Offensichtlich ist diese Lösung nicht ideal, da sie plattformspezifisch ist und auf einer ausführbaren Datei beruht. Allerdings ist die Geschwindigkeit im Vergleich zum Entpacken in Java unglaublich.

Hier ist der Code für die Dienstprogrammfunktion, die ich für die Verbindung mit diesem Dienstprogramm erstellt habe. Es gibt Raum für Verbesserungen, da der folgende Code Windows-spezifisch ist.

%Vor%     
Tony 25.07.2010 11:30
quelle

Tags und Links