Hello
again folks,
Sorry to keep troubling you - I'm very appreciative of the help you've
given so far. I've got one more for you that has got me totally
stumped. I'm writing a program which deals with largish-files, the one
I am using as a test case is not stupidly large at about 200mb. After
three evenings, I have finally gotten rid of all the stack overflows,
but I am unfortunately left with something that is rather unfeasably
slow. I was hoping someone with some keener skills than I could take a
look, I've tried to distill it to the simplest case.
This program just reads in a file, interpreting each value as a double,
and does a sort of running average on them. The actual function doesn't
matter too much, I think it is the reading it in that is the problem.
Here's the code:
import Control.Exception
import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get
import System.IO
import Data.Binary.IEEE754
myGetter acc = do
e <- isEmpty
if e == True
then
return acc
else do
t <- getFloat64le
myGetter $! ((t+acc)/2)
myReader file = do
h <- openBinaryFile file ReadMode
bs <- BL.hGetContents h
return $ runGet (myGetter 0) bs
main = do
d <- myReader "data.bin"
evaluate d
This takes about three minutes to run on my (fairly modern) laptop..
The equivilant C program takes about 5 seconds.
I'm sure I am doing something daft, but I can't for the life of me see
what. Any hints about how to get the profiler to show me useful stuff
would be much appreciated!
All the best,
Philip
PS: If, instead of computing a single value I try and build a list of
the values, the program ends up using over 2gb of memory to read a
200mb file.. any ideas on that one?