【发布时间】:2011-06-01 17:29:21
【问题描述】:
我一直在使用 Data.Binary 将数据序列化为文件。在我的应用程序中,我逐渐将项目添加到这些文件中。两个最流行的序列化包,二进制和谷物,都将列表序列化为一个计数,然后是列表项。因此,我无法附加到我的序列化文件中。我目前读入整个文件,反序列化列表,附加到列表,重新序列化列表,然后将其写回文件。但是,我的数据集变得越来越大,并且我开始耗尽内存。我可能会四处拆箱我的数据结构以获得一些空间,但这种方法无法扩展。
一种解决方案是使用文件格式来更改初始计数,然后添加我的元素。但这并不是很令人满意,更不用说由于破坏抽象而对文件格式的未来变化敏感。 Iteratees/Enumerators 在这里成为一个有吸引力的选择。我寻找了一个将它们与二进制序列化相结合的库,但没有找到任何东西。有谁知道这是否已经完成?如果没有,这方面的图书馆会有用吗?还是我错过了什么?
【问题讨论】:
-
你能写一个二进制流实例吗?编写一个逐块(渴望)编码器相对容易,它一次写入一组 n 元素。
-
哦,我不反对它相当简单。我主要想知道它是否已经完成。另外,如果没有,我应该从现有的抽象或类型类开始吗?
-
我不知道。虽然您可能会在 Hackage 上找到可搜索的文件 API。
-
你似乎正在考虑编写一个库来提供你想要的功能,假设已经不存在。如果你这样做,并将其上传到 Hackage,你会在之后返回这里并从这个问题链接到它吗?作为问题的答案或编辑。 Stack Overflow 有疯狂的谷歌果汁,所以将来任何搜索类似内容的人都可能会发现这个问题。
-
当前的 Data.Binary 列表格式是一个相当严重的缺陷,需要对结构进行两次遍历。不幸的是,出于向后兼容性的原因,它不能轻易更改。但是,您可以按照 Don 在下面的建议进行操作,并构建一个新类型包装器,并在需要序列化列表的任何地方小心使用它。
标签: serialization haskell binary stream lazy-evaluation