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を使用することを勧めていました。