Domanda

Ho avuto un problema simile a questo ragazzo durante l'elaborazione del file di registro 4 MB . In realtà sto elaborando più file contemporaneamente ma poiché continuo a ricevere questa eccezione, decido di testarlo per un singolo file:

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)
}

Quello che ottengo sempre è che fallirà a itr = 75703, mentre il mio file di output sarà sempre 64 KB (65536 byte esatti). Indipendentemente da dove metto temp.reset o System.gc, tutti gli esperimenti finiscono allo stesso modo.

Sembra che il problema si basi su un'allocazione di memoria ma non riesco a trovare alcuna informazione utile su questo problema. Qualche idea su come risolverlo?

Tutti i tuoi aiuti sono molto apprezzati

EDIT: In realtà voglio elaborarlo come file binario, quindi questa tecnica non è una buona soluzione, molti mi hanno consigliato di usare BufferedInputStream invece.

È stato utile?

Soluzione

Perché chiami reset sul sorgente prima che abbia finito di scorrere il file?

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

Dovrebbe funzionare bene senza underflow. Vedi anche questa domanda

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top