Haskell Lazy I / O und Schließen von Dateien

Ich habe ein kleines Haskell-Programm geschrieben, um die MD5-Prüfsummen aller Dateien im aktuellen Verzeichnis zu drucken (rekursiv gesucht). Grundsätzlich eine Haskell-Version vonmd5deep. Alles ist in Ordnung und gut, außer wenn das aktuelle Verzeichnis eine sehr große Anzahl von Dateien enthält. In diesem Fall erhalte ich eine Fehlermeldung wie:

<program>: <currentFile>: openBinaryFile: resource exhausted (Too many open files)

Es scheint, dass Haskells Faulheit dazu führt, dass Dateien nicht geschlossen werden, selbst nachdem die entsprechende Ausgabezeile abgeschlossen wurde.

Der entsprechende Code befindet sich unten. Die interessierende Funktion istgetList.

import qualified Data.ByteString.Lazy as BS

main :: IO ()
main = putStr . unlines =<< getList "."

getList :: FilePath -> IO [String]
getList p =
    let getFileLine path = liftM (\c -> (hex $ hash $ BS.unpack c) ++ " " ++ path) (BS.readFile path)
    in mapM getFileLine =<< getRecursiveContents p

hex :: [Word8] -> String
hex = concatMap (\x -> printf "%0.2x" (toInteger x))

getRecursiveContents :: FilePath -> IO [FilePath]
-- ^ Just gets the paths to all the files in the given directory.

Gibt es Ideen, wie ich dieses Problem lösen könnte?

Das gesamte Programm finden Sie hier:http: //haskell.pastebin.com/PAZm0Dc

Bearbeiten Ich habe viele Dateien, die nicht in den Arbeitsspeicher passen, daher suche ich keine Lösung, mit der die gesamte Datei gleichzeitig in den Arbeitsspeicher eingelesen werden kann.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage