我想为蒙特卡罗模拟处理几百个二进制数据块(“场景”)。每个场景由 100 万个浮点数组成。以下是我为场景数据创建虚拟二进制文件的方法:
import Data.Binary
import qualified Data.ByteString.Lazy as B
import Data.Array.Unboxed
scenSize = 1000000
scens = 100
main = do
let xs = array (1,scenSize) [(i, 0.0) | i <- [1..scenSize]] :: UArray Int Float
let l = take scens $ Prelude.repeat xs
B.writeFile "bintest.data" (encode l)
return ()
这工作正常。现在我想处理场景。由于可能有很多场景(scens=1000 左右),因此应该一次懒惰地完成一个块的处理。我试过decodeFile
了,但这似乎不起作用:
import Data.Binary
import qualified Data.Array.IArray as IA
import Data.Array.Unboxed as A
main = do
bs <- decodeFile "bintest.data" :: IO [UArray Int Float]
mapM_ doStuff bs
return ()
doStuff b =
Prelude.putStrLn $ show $ b IA.! 100000
这个程序似乎首先将所有数据加载到内存中,然后在运行结束时打印所有数字。它还在我的 32 位 Ubuntu 机器上使用大量内存和 scens=500 崩溃。
我究竟做错了什么?有没有一种简单的方法可以让程序懒惰地运行?