Fehlerbehebung beim Skript: Dateistreaming zur Lösung des 'Array-Länge zu groß'-Fehlers bei Dateien über 2GB? Groovy Script?
Ich versuche, ein Skript zu bearbeiten, um den Fehler 'Fehler beim Ausführen des Skripts: Erforderliche Array-Länge zu groß' zu beheben, wenn die Datei 2 GB überschreitet. Ich versuche, Dateistreaming zu verwenden, anstatt die gesamte Datei auf einmal in den Speicher zu laden.
Link zur vollständigen Seite auf GitHub :: https://github.com/freeplane/addons/issues/14#issue-2555201471
Wo ist genau dein Problem?
If all my files are over 2GB, it doesn't work. I need to edit the file to stream the files
2 Antworten
Ich versuche, Dateistreaming zu verwenden, anstatt die gesamte Datei auf einmal in den Speicher zu laden.
Tust Du nicht! getBytes() wirft den ganzen Stream in ein Array. Lösche diese Funktion.
getZipBytes() sollte statt bytes[] einen OutputStream mapStream bekommen. Aus
zipOutput << mapBytes
wird dann einfach
zipOutput << mapStream
(siehe Groovy Doku).
Ich habe den Code nur so hingeklatscht. Wenn etwas nicht klappt, frag einfach nach (hier oder auf GitHub).
Es ist ohnehin nicht ratsam ganze Dateien einfach in nen Array zu laden, wenn sie groß sind. Soweit so gut. Aber was ist denn jetzt die eigentliche Frage?
Ich sehe jetzt, dass getBytes() doch etwas mehr tut. Schreibe sie also so um, dass sie einen InputStream statt byte[] liefert. Falls MapWriter keine geeignete Methode dafür hat, definiere out als BufferedWriter auf eine temporäre Datei und gib das Ergebnis als InputStream zurück:
Den InputStream solltest Du nach Gebrauch in getZipBytes() schließen. Sauberer wäre es, in getBytes() nur einen Path zurückzugeben und das Öffnen und Schließen komplett in getZipBytes() zu erledigen.