質問

thisと同様の問題が発生しました 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