Frage

Ich habe ein ähnliches Problem, dies Typ bei der Verarbeitung von 4 MB Protokolldatei. Eigentlich gleichzeitig ich Verarbeitung mehrerer Dateien, aber da ich diese Ausnahme erhalte ich entscheiden, nur um es zu testen für eine einzelne Datei:

val temp = Source.fromFile("./datasource/input.txt")
val dummy = new PrintWriter("test.txt")
var itr = 0
println("Default Buffer size: " + Source.DefaultBufSize)
try {
    for( chr <- temp) {
        dummy.print(chr.toChar)
        itr += 1
        if(itr == 75703) println("Passed line 85")
        if(itr % 256 == 0){ print("..." + itr); temp.reset; System.gc; }
        if(itr == 75703) println("Passed line 87")
        if(itr % 2048 == 0) println("")
        if(itr == 75703) println("Passed line 89")
    }
} finally {
    println("\nFalied at itr = " + itr)
}

Was ich immer bekommen, ist, dass es nicht wird bei itr 75703 =, während meine Ausgabedatei immer 64KB sein wird (65536 Bytes exakt). Egal wo ich setzte temp.reset oder System.gc, alle Versuche bis Ende gleich.

Es scheint, wie das Problem auf einiger Speicherzuweisung beruht, aber ich kann keine nützlichen Informationen zu diesem Problem finden. Jede Idee, wie diese zu lösen?

Alle Ihre hilft sehr geschätzt

EDIT:. Eigentlich mag ich es als binäre Dateien verarbeiten, so dass diese Technik keine gute Lösung ist, hatten viele mich empfehlen BufferedInputStream zu verwenden, anstatt

War es hilfreich?

Lösung

Warum rufst du reset auf der Source, bevor es fertig ist durch die Datei iterieren?

val temp = Source.fromFile("./datasource/input.txt")
try {
  for (line <- tem p.getLines) {
    //whatever
  }
finally temp.reset     

Sollte ohne Unterschreitungen gut funktionieren. Siehe auch diese Frage

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top