Streaming Boost.Serialization归档

时间:2014-05-11 22:03:04

标签: c++ serialization boost streaming

我有一个大型数据集(100k +项目)我想使用Boost.Serialization序列化。这种方法令人满意。

现在,当处理更大的数据集时,整个集合不再适合内存(我目前存储std::map所有数据都存档)。由于我既不需要随机读取也不需要随机读取或写入,我只需要一次访问一个项目,我想通过直接将实例保存到存档(archive << item1 << item2 ...)并逐个解压缩来对数据集进行流式传输。

另一种选择是从头开始创建一种新的文件格式(像<length><block>那样简单,其中每个<block>对应一个Boost.Serialization存档),因为我注意到它看起来不像可以检测到Boost.Serialization中存档的结束而不会捕获异常(我认为应该在存档结束时读取input_stream_error)。

哪个选项比另一个更好?滥用序列化存档用于流式传输似乎很奇怪,而且具有不重新发明轮子的巨大优势,而文件格式包装档案感觉更干净但更容易出错。

1 个答案:

答案 0 :(得分:1)

使用提升序列化进行流式处理滥用它而不是奇怪的。

事实上,Boost Serialization只有没有,但是流媒体存档界面。所以是的,适用的方法是按照你的说法去做:

archive << number_of_items;
for(auto it = input_iterator(); it != end(); ++it)
    archive << *it;

事实上,很少有人阻止你在serialize方法中做同样的事情。您甚至可以通过将流包装成某些东西(如iterator_range?)并将Boost序列化扩展为“理解”这些来“自动”,就像它“理解”容器,数组等一样。

文件格式方法肯定是更清洁(从库的角度来看),因为它破坏了归档格式隔离。序列化库经过精心设计,以避免了解存档表示,并且规避此操作将违反抽象规范。另见

相关问题