Ich muss eine große Datei (~ 450 Mbyte) durch die Java-Klasse ZipOutputStream komprimieren. Diese große Dimension verursacht ein Problem des "OutOfMemory" -Fehlers meines JVM Heap Space. Dies geschieht, weil die Methode "zos.write (...)" den gesamten Dateiinhalt vor der Komprimierung in einem internen Byte-Array speichert.
%Vor%Die natürliche Lösung wird darin bestehen, den Heap-Speicherraum der JVM zu vergrößern, aber ich würde gerne wissen, ob es eine Methode gibt, um diese Daten in einer Streaming-Art zu schreiben. Ich brauche keine hohe Kompressionsrate, damit ich den Algorithmus auch ändern kann.
Hat jemand eine Idee dazu?
Laut Ihrem Kommentar zu Sams Antwort haben Sie offensichtlich einen ZipOutputStream erstellt, der einen ByteArrayOutputStream umschließt. Der ByteArrayOutputStream speichert das komprimierte Ergebnis natürlich im Speicher zwischen. Wenn Sie es auf die Festplatte geschrieben haben möchten, müssen Sie den ZipOutputStream um einen FileOutputStream wickeln.
Es gibt eine Bibliothek namens TrueZip , die ich in der Vergangenheit mit gutem Erfolg verwendet habe so etwas.
Ich kann nicht garantieren, dass es auf der Pufferfront besser läuft. Ich weiß, dass es viele Dinge mit seiner eigenen Kodierung macht und nicht abhängig von der Zip-API des JDK.
Also ist es meiner Meinung nach einen Versuch wert.
ZipOutputStream ist streambasiert, es speichert den Speicher nicht. Dein PUFFER ist möglicherweise zu groß.
Ich frage mich, ob es daran liegt, dass Sie den Inhalt in einem ZipEntry speichern, vielleicht lädt er im Grunde seinen gesamten Inhalt, bevor er den ZipEntry schreibt. Müssen Sie Zip verwenden? Wenn es nur einen Datenstrom gibt, den Sie komprimieren müssen, schauen Sie stattdessen in den GZIPOutputStream. Ich glaube, dass es nicht das gleiche Problem hätte.
Hoffe, das hilft.
Tags und Links java zip large-files