1

私の知る限り、scalaのファイル/URLのイテレータは怠惰です。

scala.io.Source.fromFile("c:/tmp.csv") getLines()

Iterator[String]まだファイルを読み込んでおらず、単にそのファイルの最初の行を指しているを返す必要があります。それでも、このコードをデバッグし、次の行で停止し、HDD上のファイルを物理的に変更すると、このイテレーターによって返される値は、更新前のファイルに対応します。なぜそうなのですか?

これは、ファイル全体をメモリにプリフェッチするJavaイテレータから期待するものです。

4

1 に答える 1

1

明らかに、ファイルからの読み取りはバッファリングされます(ディスクアクセスが遅いため、パフォーマンスを向上させるため)。したがって、ファイルから読み取りを開始すると、その一部がすぐにバッファーに読み込まれます(たとえば、4kb)。したがって、既に読み取られた部分を編集しても、プログラム内で変更されることはありません。

7Mbファイルでこれを実行しようとしました-ファイルを開き、最後の行を編集すると、編集がコードに適切に反映されました。逆に、4Kbファイルで同じトリックを実行すると、あなたが説明した動作が得られました。

編集:実際のバッファリングはこれらの行のどこかで発生していると思います(コメントが大好きです:))。

EDIT2:実際、あなたは面白いバグを見つけたと思います-私は今30分ソースを見ているので、への呼び出しの前にバッファリングが行われる可能性のある場所がまだわかりませんgetLines

于 2012-10-08T18:49:50.183 に答える