java outOfMemoryError mit stringbuilder
Ich bin immer ein java Fehler wegen ungenügenden Speicherplatzes, wenn ich diese Methode aufrufen - ich verwende es in eine Schleife zu analysieren, viele große Dateien in der Reihenfolge. meine Vermutung ist, dass result.toString()
ist nicht immer Müll gesammelt, ordnungsgemäß während der Schleife. wenn ja, wie soll ich es beheben?
private String matchHelper(String buffer, String regex, String method){
Pattern abbrev_p = Pattern.compile(regex);//norms U.S.A., B.S., PH.D, PH.D.
Matcher abbrev_matcher = abbrev_p.matcher(buffer);
StringBuffer result = new StringBuffer();
while (abbrev_matcher.find()){
abbrev_matcher.appendReplacement(result, abbrevHelper(abbrev_matcher));
}
abbrev_matcher.appendTail(result);
String tempResult = result.toString(); //ERROR OCCURS HERE
return tempResult;
}
- Wie groß ist eine "große Datei"? Kann es sein, dass du einfach nicht die Zuweisung genügend Arbeitsspeicher für die JVM.
- Fehler anzeigen text für weitere Untersuchungen.
- wie über die Reine Zeichenfolge OString Länge: 2769348 ? Die meisten der String ist der nexString von Fotos erfasst
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschrieben auf diese Weise, werden Sie brauchen etwa 6 Byte für jedes Zeichen in der Datei.
Jedes Zeichen zwei bytes. Sie haben die raw input, der ersetzt die Ausgabe (in den Puffer) und Fragen Sie für Dritte zu kopieren, wenn Sie run out of memory.
Wenn die Datei codiert ist so etwas wie ASCII oder ISO-8859-1 (single-byte character encoding), das heißt, es wird sechs mal größer in Erinnerung als auf der Festplatte.
Könnte man mehr Speicher zuzuweisen, um den Prozess, aber eine bessere Lösung sein könnte, zum verarbeiten der Eingabe "streamwise"—Lesen, - scan und schreibt die Daten ohne laden alle gleichzeitig in den Speicher.
BufferedReader rd = new BufferedReader(new FileReader("/path/to/your/file"));
und aufrufenreadLine()
imwhile
Schleife, dann tun Sie das ersetzt, und tun, was notwendig ist, mit der geänderten Zeile.Wenn Sie Ihre Dateien verarbeitet werden, sind alle sehr groß, sagen mehr als ein paar hundert MB, dann sollten Sie wirklich gehen mit stream-processing, anstatt diesem "laden in den Speicher", gerade so wie @erickson vorgeschlagen.
Ansonsten gibt es ein paar Dinge, die Sie könnten versuchen, alle, die Speichernutzung zu verringern, so viel wie möglich:
StringBuffer
eine erste Größe, die gleiche wie die Länge der gegebenenString
buffer
. Dies sollte reduzieren die unnötige Speichernutzung, während die Ausweitung derStringBuffer
im Prozess. Ich nehme an, es ist nur zu ersetzen Sie bestimmte Wörter von der ursprünglichen Zeichenkette und sollte mehr oder weniger die gleiche Länge.StringBuffer
Objekt statt. Aufruf dertoString()
nur, nachdem Sie loszuwerden, die originalString
Objekt.Ich Schätze, das problem mit
StringBuilder.append()
. Wenn Matcher hängt Sequenz von Zeichen, die der Baumeister.Wie bereits im Artikel über Fehler wegen ungenügenden Speicherplatzes mit StringBuilder/StringBuffer, es ist ein bekanntes Problem, dass append() wird die doppelte Kapazität, wenn interne Puffer
chars
wenn die Kapazität nicht ausreicht.Gehen Sie für streams wie vorgeschlagen von Erickson.
Ich Stimme mit den anderen Antworten ... aber ... einfach, weil die exception Auftritt, gibt es nicht unbedingt meine, es ist das problem. Sie kann sehr gut sein, undichte Speicher anderswo und dass ausgerechnet der Ort, der es aufgedeckt. Führen Sie eine profiler zu prüfen memory-Nutzung und überprüfen genau das, was Objekte nicht erfasst werden.
Ja! Nicht im Puffer gespeichert wird, sonst wirst du es ausführen, besonders, wenn Sie gehen über 2MB auf I/O.
Empfohlen link für die Festsetzung und anfügen von text: http://java.ittoolbox.com/documents/appending-data-to-a-file-18786
Könnten Sie versuchen, die Rückkehr eines
StringBuffer
und Einstellungnull
nach dem Gebrauch.