2009-10-26 3 views
3

4MB 로그 파일을 처리하는 중 비슷한 문제가 발생했습니다. this guy이 발생합니다. 사실은 내가 동시에 여러 파일을 처리하고있어하지만 난이 예외가 계속 있기 때문에, 난 그냥 하나의 파일을 테스트하기로 결정 :스칼라에서 파일을 처리 할 때 java.nio.BufferUnderflowException이 발생했습니다

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을를 사용하는 저를 추천했다. 이 파일을 통해 반복 완료되기 전에

+1

검색 중 http://lampsvn.epfl.ch/trac/scala/ticket/1883이 발견되었습니다. 또한 그것의 사본이 있습니다. 기본적으로 Java와 Scala는 파일에 대한 인코딩에 동의하지 않습니다. 이러한 인코딩은 이러한 언더 플로우로 끝납니다. 그것에 대해 무엇을 할 수 있는지 잘 모릅니다. –

+0

예. 티켓 페이지에 따르면 스칼라 사용자를위한 BufferUnderFlow에 대한 유일한 해결책은 스칼라 2.8을 기다리는 것입니다. – Ekkmanz

답변

1

은 왜 Sourcereset를 호출?

val temp = Source.fromFile("./datasource/input.txt") 
try { 
    for (line <- tem p.getLines) { 
    //whatever 
    } 
finally temp.reset  

언더 플로우없이 잘 작동해야합니다. 또한 this question