[Haskell] array IO

Ketil Malde ketil at ii.uib.no
Wed Feb 25 15:07:09 EST 2004


Since I discovered that my program spent most of its time reading and
writing files, I had a go at transforming it from using readFile to
using array IO.

Since my file consists of lines of length 18, I tried writing a
similar function to readFile, to return a lazy list of lines as
arrays, included below.  This works, but wasn't more efficient.  I
haven't toyed to much with this kind of thing before, so please let me
know if I'm doing anything obviously stupid.

Perhaps the whole strategy is wrong?  Should I wrap more of my program
in IO, and do things incrementally there?  (The files can be large,
typically 100M-2G range, so reading them strictly is not an option)

Or would it be more efficient to read larger chunks at a time?  If so,
what is a good chunk size? 1K? 4K? 1M?


  -- read the external file as a lazy list of arrays
  readXFile :: FilePath -> IO [UArray Int Word8]
  readXFile f = do
	      h <- openFile f ReadMode
	      getArrays h
      where getArrays h = do end <- hIsEOF h
			   case end of
		             True -> return []
			     False -> do
			        (a :: IOUArray Int Word8) <- newArray (0,17) 0 
			        hGetArray h a 18
				a' <- unsafeFreeze a
			        as <- unsafeInterleaveIO (getArrays h)
				return (a':as)


If I haven't seen further, it is by standing in the footprints of giants

More information about the Haskell mailing list