5000 개의 파일이 5000 개의 파일로 저장되어 있습니다. 나는 그들의 합계를 찾아야한다. DF2 유형은 Vector Double
의 동의어이며 Num의 인스턴스가됩니다. 그래서 읽고 [IO DF2]
를 나열하고 그것을 접어 모든 파일을 구문 분석 : 나는 오류가 발생하지만리소스 소모 (열려있는 파일이 너무 많음)
getFinal :: IO DF2
getFinal = foldl1' (liftA2 (+)) $ map getDF2 [1..(sdNumber runParameters)]
where getDF2 i = fmap parseDF2 $ readFile ("DF2/DF2_" ++ show i)
을 :
DF2: DF2/DF2_1022: openFile: resource exhausted (Too many open files)
구글은 매우 일반적인 것으로이 문제를 밝혀 :
그러나 게으른 IO 문제는 무엇인지 알지 못했습니다. 게으른 경우 파일이 필요하기 전에 파일을 여는 이유는 무엇입니까? Duncan Coutts가 내 경우에 elegant solution을 적용하는 방법을 이해하지 못했습니다.
예제에서 마지막 두 문자열은'evaluate $ parseDF2 s'로 바꿀 수 있으며'length s'는 필요하지 않습니다. 그래서 정말로 컴팩트 한 솔루션이 있어야합니다. – Yrogirg
'getDF2'의 두 줄은'return $! '로 바꿀 수 있다고 생각합니다. parseDF2 s'라고합니다. 적어도 관련된 'Vector'가 언 박싱되어 있다면 적어도. –
@Yrogirg : 그건 잘 작동하지 않습니다 :'evaluate'은 WHNF에 한 수준 만 평가하고 파서는'DF2'의 게으른 필드에서 파싱 작업을 쉽게 할 수 있습니다. deepseq 패키지를 사용했다면 (보통), getDF2 i = force를 사용할 수 있다고 생각합니다. parseDF2 <$> readFile ("DF2/DF2_"++ show i)'. – ehird