我正在尝试使用 Data.Binary 中的 encodeFile 和 decodeFile 函数来保存一个非常大的数据结构,这样我每次运行这个程序时就不必重新计算它。相关的编码和解码功能如下:
writePlan :: IO ()
writePlan = do (d, _, bs) <- return subjectDomain
outHandle <- openFile "outputfile" WriteMode
((ebsP, aP), cacheData) <- preplanDomain d bs
putStrLn "Calculated."
let toWrite = ((map pseudofyOverEBS ebsP, aP),
pseudofyOverMap cacheData) :: WrittenData
in do encodeFile preplanFilename $ encode toWrite
putStrLn "Done."
readPlan :: IO (([EvaluatedBeliefState], [Action]), MVar HeuCache)
readPlan = do (d, _, _) <- return subjectDomain
inHandle <- openFile "outputfile" ReadMode
((ebsP, aP), cacheData) <- decodeFile preplanFilename :: IO WrittenData
fancyCache <- newMVar (M.empty, depseudofyOverMap cacheData)
return $! ((map depseudofyOverEBS ebsP, aP), fancyCache)
计算和写入文件的程序(使用 writePlan)执行没有错误,输出一个巨大的二进制文件。但是,当我运行接收此文件的程序时,执行 readPlan 会导致错误(程序名称为“Realtime”):
Realtime: demandInput: not enough bytes
我无法确定这一点,并且搜索谷歌并没有发现任何关于此消息的实质性文档或讨论。任何见解将不胜感激!