2017-10-18 1 views
0

Ich versuche, eine riesige Daten um 64000 Datensätze gleichzeitig in eine Datei zu schreiben. Ich bekomme Ausnahmen, die ich unten anbringe. enter image description hereJava-Heap-Platz Fehler beim Schreiben in eine Datei

der Code, den ich schreibe verwendet ist

Path outputpath = Paths.get("file1.json"); 
try (BufferedWriter writer = Files.newBufferedWriter(outputpath, StandardCharsets.UTF_8, WRITE)) { 
writer.write(jsonObject.toString()); 
} catch (Exception e) { 
//error msg 
} 

Hier mein "JSONObject" ist nichts anderes als ein JSON-Array, die 65000 Zeilen enthält.

Können Sie mir bitte helfen, dies in meine Datei auf eine effiziente Weise zu schreiben, so dass ich vermeiden kann, dass Heap Space Error.

+0

Erstellen Sie keine In-Memory-Darstellung Ihres JSON, streamen Sie es zum 'writer'. –

+0

können Sie mit dieser Lösung versuchen: https://stackoverflow.com/questions/1062113/fastest-way-to-write-huge-data-in-text-file-java –

+0

Geben Sie mehr Speicherplatz für Ihre JVM, wenn Sie beginnen Sehen Sie sich die Befehlszeilenoption -Xmx an. Oder versuche zu streamen wie MleRutte vorgeschlagen –

Antwort

-1

Sie können iterate durch Ihre Json Objekt versuchen:

Iterator<String> keys = (Iterator<String>) jsonObject.keys(); 
while (keys.hasNext()) { 
    String key = keys.next(); 
    JSONObject value = jsonObject.getJSONObject(key); 
    writer.write(value.toString()); 
} 

PS. Sie müssen die Struktur Ihres Json-Objekts überprüfen.

1

Sie haben Ihre Stacktrace ein wenig kurz geschnitten, aber ich nehme an, die Ausnahme passiert in JsonObject.toString().

Grundsätzlich müssen Sie zwischen zwei Dingen entscheiden: entweder mehr Speicher zuweisen oder die große Operation in mehrere kleinere aufteilen. Hinzufügen von Speicher ist schnell und einfach, aber wenn Sie in Zukunft noch mehr Daten erwarten, wird es Ihr Problem nicht für immer lösen. Wie andere bereits erwähnt haben, verwenden Sie -Xmx und/oder -Xms in der Java-Befehlszeile.

Das nächste, was Sie versuchen könnten, ist eine andere JSON-Bibliothek zu verwenden. Vielleicht ist die, die Sie jetzt verwenden, nicht besonders für große JSON-Objekte geeignet. Oder es könnte eine neuere Version geben.

Als letzte Möglichkeit können Sie JSON immer selbst konstruieren. Es ist eine Zeichenfolge, und Sie haben bereits die Daten im Speicher. Um so effizient wie möglich zu sein, müssen Sie nicht einmal die gesamte Zeichenfolge auf einmal erstellen. Sie könnten einfach mitmachen und Stück für Stück in Ihren BufferedWriter schreiben.

Verwandte Themen