3

在处理4MB日志文件时,我遇到了与此人类似的问题。实际上我正在同时处理多个文件,但由于我不断收到这个异常,我决定只测试一个文件:

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

我总是得到的是它会在 itr = 75703 处失败,而我的输出文件将始终为 64KB(精确为 65536 字节)。无论我将 temp.reset 或 System.gc 放在哪里,所有实验的结果都是一样的。

这个问题似乎依赖于一些内存分配,但我找不到关于这个问题的任何有用信息。关于如何解决这个问题的任何想法?

非常感谢您的所有帮助

编辑:实际上我想将它作为二进制文件处理,所以这种技术不是一个好的解决方案,很多人建议我改用 BufferedInputStream。

4

1 回答 1

1

你为什么在它完成对文件的迭代之前调用resetSource

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

应该可以正常工作,没有下溢。另请参阅此问题

于 2009-10-26T09:32:16.383 回答