
On Sat, Feb 20, 2010 at 4:42 PM, Stephen Blackheath [to
Haskell-Beginners]
Tom,
The bad news is that 1. Haskell makes no guarantee about when the files are closed,
Hmm, Data.ByteString.Lazy.readFile's docstring says: "Read an entire file lazily into a ByteString. The Handle will be held open until EOF is encountered." It certainly seemed to change matters once I switched that $ to $!, though; I don't see why that would have helped me unless the handles were indeed being closed.
2. file handles are a limited resource
Well, yes, that's why I ran into the original problem.
and 3. lazy I/O doesn't handle errors in a recoverable fashion.
I suppose this will be something I'll run into before too long.
Unfortunately this means that lazy I/O is fundamentally unsound.
The only safe way to do it is to read the file strictly in blocks using Data.ByteString.hGet.
But with the strict version of ByteString, how would I compute the SHA1 hash of an 8 GB file on a machine with quite a bit less memory? I can't imagine Haskell just has no way to handle a case that other languages handle easily.