나는 병렬로 처리하려고하는 xml 파일을 가지고있다. 미래를 사용하는 나의 스칼라 코드 (2.9.2)는 정상적으로 시작하지만 내 컴퓨터에있는 32G의 거의 100 %를 차지합니다. 이 작업을 순차적으로 수행하면 이런 일이 발생하지 않으므로 내 생각에 스칼라 선물 사용시 가비지 수집에 문제가있는 것입니다.스칼라 미래의 가비지 컬렉션
다음은 제 코드를 제거한 것입니다. 누가 잘못되었는지 말해 줄 수 있니?
val filenameGroups = someStringListOfFilepaths.grouped(1000).toStream
val tasks = filenameGroups.map {
fg =>
scala.actors.Futures.future {
val parser = new nu.xom.Builder() // I'm using nu.xom. Not sure it matters.
fg.map {
path => {
val doc = parser.build(new java.io.File(path))
val result = doc.query(some xpath query)
result
}
}.toList
}
}
val pairs = tasks.par.flatMap(_.apply)
이메일 : 알았어, 내가 해결 했어.하지만 왜 이것이 차이가 나는지 아직도 모르겠다.
내부 루프의 대부분의 코드를 추출한 다음 다시 작성합니다. 그리고 미래의 파서 인스턴스화를 꺼 냈습니다. 현재 메모리 사용량은 17 %로 평평하게 유지됩니다. 아무도 이것이 왜 차이를 만들지 어떤 생각을 가지고 있습니까? 여기
내가 무슨 짓을했는지의 단순화 된 버전입니다 : 이def process(arglist...) = yada
val tasks = filenameGroups.map {
fg =>
val parser = new nu.xom.Builder()
scala.actors.Futures.future {
process(fg, parser)
}
}
val pairs = tasks.par.flatMap(_.apply)
얼마나 많은 파일을 동시에 처리 하시겠습니까? 너는 그것들 중 적어도 수천이있는 것 같아. 수천 개의 XML 파일을 메모리에로드하면 전체 RAM이 빠르게 소모됩니다. 이 작업을 순차적으로 수행하면 기본적으로 파일을 읽고 처리하며 가비지 수집에 적합합니다. –
@TomaszNurkiewicz 최대한 많은 수의 파일을 처리하고 200,000 개의 파일이 있습니다. 나는 단지 스칼라 미래가 현명 할 것이고 오직 8 개의 (또는 당신이 가진 많은 프로세서가) 미래의 인스턴스를 생성 할 것이라고 생각했기 때문에 나는 한 번에 8 개의 XML 문서만을 메모리에 가지고있다. – JasonMond