2

我正在尝试使用 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

我无法确定这一点,并且搜索谷歌并没有发现任何关于此消息的实质性文档或讨论。任何见解将不胜感激!

4

1 回答 1

3

我参加聚会很晚,但在寻求类似问题的帮助时发现了这一点。我正在使用Data.Binary.Get. 正如您在此处看到的,该函数在 中定义Data.Binary.Get.Internal。现在我在猜测,但是您的 decodeFile 函数可能会进行某种解析,并且由于文件未完全解析而引发错误(即解析器认为文件中必须有其他内容,但它已经达到 EOF)。

希望对任何有此/类似问题的人有所帮助!

于 2014-08-06T16:37:32.363 回答