在处理 4MB 日志文件时,我遇到了与this guy类似的问题。实际上我正在同时处理多个文件,但由于我一直得到这个异常,我决定只测试一个文件:
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。答案 0 :(得分:1)
为什么在完成通过文件迭代之前,在reset
上调用 Source
?
val temp = Source.fromFile("./datasource/input.txt")
try {
for (line <- tem p.getLines) {
//whatever
}
finally temp.reset
如果没有下溢,应该可以正常工作。另请参阅this question