Pregunta

Tengo un problema similar a esto chico mientras procesa el archivo de registro 4MB . En realidad, estoy procesando varios archivos simultáneamente, pero como sigo recibiendo esta excepción, decido probarlo para un solo archivo:

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

Lo que siempre obtengo es que fallará en itr = 75703, mientras que mi archivo de salida siempre será de 64 KB (65536 bytes exactos). No importa dónde coloque temp.reset o System.gc, todos los experimentos terminan igual.

Parece que el problema depende de alguna asignación de memoria, pero no puedo encontrar ninguna información útil sobre este problema. ¿Alguna idea sobre cómo resolver este?

Todas sus ayudas son muy apreciadas

EDITAR: en realidad quiero procesarlo como archivos binarios, por lo que esta técnica no es una buena solución, muchos me recomendaron usar BufferedInputStream en su lugar.

¿Fue útil?

Solución

¿Por qué llama a reset en el Source antes de que haya terminado de iterar a través del archivo?

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

Debería funcionar bien sin desbordamientos. Consulte también esta pregunta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top