我正在尝试使用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
我无法做出这方面的头脑和尾巴,并且谷歌搜索没有发现任何实质性的文档或讨论此消息。任何见解都将不胜感激!
答案 0 :(得分:3)
我参加派对的时间很晚,但在寻找类似问题的帮助时发现了这一点。我正在使用Data.Binary.Get
的增量接口。正如您在here中看到的那样,该函数在Data.Binary.Get.Internal
中定义。现在我猜,但你的decodeFile函数可能会进行某种解析并抛出错误,因为文件没有完全解析(即解析器认为文件中必须有其他东西,但它已经到达EOF)。
希望能帮助任何有这个/类似问题的人!