2017-07-06 4 views
1

J'utilise Java PrintWriter pour écrire une Scala HashMap dans un fichier. Voici le code que je utilise:Le graveur d'impression Java se termine

def writeToFileAsMapUsingPrintWriter(data: mutable.HashMap[String, Int], outputFilename: String, outputDirectoryPath: String): Unit = { 
val myfile = new File (outputDirectoryPath, outputFilename); 
val printWriter = new PrintWriter(myfile); 
for ((k, v) <- data) { 
    printWriter.println(s"$k->$v") 
} 
printWriter.close();} 

Maintenant, le problème est le suivant PrintWriter enroule quelques lignes autour de la prochaine nouvelle ligne dans le fichier de sortie. Par exemple:

CC PRP VBP JJ1 to get JJ2 IN ->821065 2000 DT RBS JJ1 IN the hundred of JJ2 year->10521306 PRP be JJ1 TO VB JJ2 IN ->10521307 DT world POS JJ1 marketer , MD lead JJ2 effort->10521308

Cela devient un problème parce que quand je l'ai lu ce dossier en arrière, je vais ligne par ligne, et je rencontre des lignes sans id, comme ci-dessus. Et la partie intéressante est que cela se produit uniquement pour les mêmes lignes toujours. Il y a des lignes plus longues, mais elles ne s'enroulent pas.

J'ai essayé d'exécuter le PrintWriter séparément pour juste avec ces 5 lignes dans un HashMap, puis il imprime ces lignes dans la même ligne sans m'enrouler. C'est seulement quand je le nourris ma carte de hachage de 11 Go que cela se produit. J'ai également essayé de remplacer le println par une impression, mais n'a pas fait de différence.

printWriter.print(s"$k->$v\n")

Je peux peut-être aller avec une commande sed et fixer ces lignes dans le fichier, mais fixerai que ces deux, et la coutume fixer d'autres. De plus, c'est juste une solution temporaire.

Cela me semble être un problème de mémoire. Est-ce que quelqu'un a déjà rencontré ça?

En attendant, je vais essayer plus de méthodes d'essais et d'erreurs. Donc, je vais remplacer le PrintWriter par un BufferedWriter, en utilisant la commande flush() comme here etc.

Juste que cela prend 12 heures pour exécuter mon programme une fois, donc le temps d'exécution est énorme. D'où la question juste au cas où quelqu'un aurait déjà rencontré cela auparavant.

Répondre

0

Êtes-vous sûr que vos clés ne contiennent pas de nouvelles lignes? Cela peut parfois être difficile à repérer. Je suppose que cela pourrait résoudre:

printWriter.println(s"${k.trim()}->$v") 

Je suis très sceptique qu'il y ait une sorte de problème de mémoire ou autre bug avec la bibliothèque standard machine virtuelle Java ou Java.