You need to use STUArray. The Data.Array completely-immutable-and-boxed arrays are ok only for tasks where you build an array once and don't modify it, and where you need array elements to be lazy. The // operation creates a copy of the whole array with one element modified. It should probably be called "turtleSlowCopyWholeArrayAndModifySingleElement".
2009/2/26 Daniel Kraft <[email protected]>: > Hi, > > I seem to be a little stuck with incremental array updates... I've got an > array of "few" (some thousand) integers, but have to do a calculation where > I incrementally build up the array. For sake of simplicity, for now I don't > use a State-Monad but simply pass the array as state down the recursive > calls. > > Unfortunatelly, I seem to experience problems with lazyness; when I run my > program, memory usage goes up to horrific values! The simple program below > reproduces this; when run on my machine, it uses up about 300 MB of real and > 300 MB of virtual memory, and the system starts swapping like mad! I > compiled with ghc --make -O3, ghc version 6.8.3 if that matters. > > BTW, I tried to make the array update strict using the `seq` as below, but > with no effect... What am I doing wrong here? > > Many thanks, > Daniel > > > > > import Data.Array; > > > arraySize = 1000 > limit = 100000 > > type MyArray = Array Int Int > > emptyArray :: MyArray > emptyArray = array (0, arraySize - 1) [ (i, 0) | i <- [0 .. arraySize - 1] ] > > > procOne :: Int -> MyArray -> MyArray > procOne a cnt > | a > limit = cnt > | otherwise = > let ind = a `mod` arraySize > oldcnt = cnt ! ind > newarr = cnt // [(ind, oldcnt + 1)] > in > procOne (a + 1) (newarr `seq` newarr) > > > main :: IO () > main = > do > arr <- return $ procOne 0 emptyArray > print $ arr ! 42 > > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe > -- Eugene Kirpichov Web IR developer, market.yandex.ru _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
