我遇到类似的问题这个处理 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。

有帮助吗?

解决方案

为什么在完成通过文件迭代之前,在 Source 上调用 reset

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top