Haskell ленивый ввод-вывод и закрытие файлов
Я написал небольшую программу на Haskell для печати контрольных сумм MD5 для всех файлов в текущем каталоге (рекурсивный поиск). В основном версия на Haskellmd5deep
, Все хорошо, за исключением случаев, когда в текущем каталоге очень большое количество файлов, и в этом случае я получаю сообщение об ошибке:
<program>: <currentFile>: openBinaryFile: resource exhausted (Too many open files)
Кажется, лень Хаскелла заставляет его не закрывать файлы, даже после завершения соответствующей строки вывода.
Соответствующий код ниже. Функция интересаgetList
.
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.
Есть какие-нибудь идеи о том, как мне решить эту проблему?
Вся программа доступна здесь:http://haskell.pastebin.com/PAZm0Dcb
Редактировать: У меня много файлов, которые не помещаются в ОЗУ, поэтому я не ищу решение, которое считывает весь файл в память сразу.