2017-10-18 2 views
0

J'essaie d'écrire une énorme quantité de données autour de 64000 à la fois dans un fichier. Je reçois des exceptions que je joins ci-dessous. enter image description herejava heap espace erreur lors de l'écriture dans un fichier

le code que je l'habitude d'écrire est

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 
} 

Voici mon "JSONObject" est rien, mais un tableau JSON qui contient 65000 lignes.

Pouvez-vous s'il vous plaît m'aider à écrire ceci à mon dossier d'une manière efficace, de sorte que je puisse éviter cela heap Space Error.

+0

Ne créez pas une représentation en mémoire de votre fichier JSON, diffusez-la dans le fichier 'writer'. –

+0

vous pourriez essayer avec cette solution: https://stackoverflow.com/questions/1062113/fastest-way-to-write-huge-data-in-text-file-java –

+0

Donnez plus de mémoire à votre JVM lorsque vous démarrez Regardez l'option de ligne de commande -Xmx. Ou essayez de diffuser comme MleRutte suggéré –

Répondre

-1

Vous pouvez essayer de iterate par votre objet JSON:

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

PS. Vous devez vérifier la structure de votre objet json.

1

Vous avez coupé votre stacktrace un peu court, mais je suppose que l'exception se produit dans jsonObject.toString(). Fondamentalement, vous devez choisir entre deux choses: allouer plus de mémoire ou diviser la grosse opération en plusieurs plus petites. L'ajout de mémoire est rapide et simple, mais si vous attendez encore plus de données dans le futur, cela ne résoudra pas votre problème pour toujours. Comme d'autres l'ont mentionné, utilisez -Xmx et/ou -Xms sur la ligne de commande java.

La prochaine chose que vous pouvez essayer est d'utiliser une bibliothèque JSON différente. Peut-être que celui que vous utilisez actuellement n'est pas particulièrement adapté aux grands objets JSON. Ou il pourrait y avoir une version plus récente. En dernier recours, vous pouvez toujours construire vous-même le JSON en tant que dernier recours. C'est une chaîne après tout, et vous avez déjà les données en mémoire. Pour être aussi efficace que possible, vous n'avez même pas besoin de construire toute la chaîne à la fois, vous pouvez juste aller et écrire des morceaux à votre BufferedWriter.