Pergunta

Eu tenho um problema semelhante ao este cara ao processar 4MB arquivo de log. Na verdade eu estou processando vários arquivos simultaneamente, mas desde que eu continuo recebendo essa exceção, eu decidir apenas testá-lo para um único arquivo:

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

O que eu sempre obter é que ele irá falhar na ITR = 75703, enquanto o meu arquivo de saída será sempre 64KB (65536 Bytes exato). Não importa onde eu coloco temp.reset ou System.gc, todos os experimentos acaba o mesmo.

Parece que o problema depende de alguns alocação de memória, mas não consigo encontrar qualquer informação útil sobre este problema. Qualquer idéia sobre como resolver este?

Toda a sua ajuda são muito apreciados

EDIT:. Na verdade eu quero processá-lo como arquivos binários, assim que esta técnica não é uma boa solução, muitos tinham me recomendar usar BufferedInputStream vez

Foi útil?

Solução

Por que você está chamando reset na Source antes que ele tenha a iteração acabado através do arquivo?

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

deve funcionar muito bem sem underflows. Veja também esta questão

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top