2012-10-08 2 views
1

, 즉스칼라 - 나는 게으른 스칼라에서 파일/URL을 반복자를 알고 지금까지 게으른 파일/URL 반복자

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

아직에서 파일을 읽을 수있다 단순히 가리키는하는 Iterator[String]를 반환해야 그 파일의 첫번째 줄. 아직이 코드를 디버깅하고 다음 라인에서 멈추고 물리적으로 HDD의 파일을 변경하면이 이터레이터에서 반환 된 값은 업데이트 전 파일과 일치합니다. 왜 그런 경우입니까?

이, 나는

답변

1

분명히 메모리에 wholefile 프리 페치 것이라고, 자바 반복자에서 epect 것 인 것이다 파일이 버퍼링에서 읽기 (디스크 액세스 속도가 느린 때문에, 성능을 향상하기 위해). 따라서 파일에서 읽기를 시작하면 일부는 즉시 버퍼로 읽히고 (예 : 4kb), 이미 읽은 부분을 편집하면 프로그램에서 변경되지 않습니다.

7Mb 파일로이 작업을 시도했습니다. 파일을 열고 마지막 줄을 편집했으며 편집 내용이 코드에 제대로 반영되었습니다. contary에서 4KB 파일로 동일한 트릭을했을 때, 나는 당신이 묘사하는 행동을 취했다.

편집 : 실제 버퍼링은 어딘가에서 발생하는 것으로 생각됩니다 these lines (나는 그곳에있는 코멘트를 사랑합니다 :)).

EDIT2 : 실제로, 나는 30 분 동안 소스를보고있어 아직 버퍼링이 일어날 장소가 보이지 않기 때문에 재미있는 버그를 발견했다고 느낍니다. getLines .