我有一个大型数据集(100k +项目)我想使用Boost.Serialization序列化。这种方法令人满意。
现在,当处理更大的数据集时,整个集合不再适合内存(我目前存储std::map
所有数据都存档)。由于我既不需要随机读取也不需要随机读取或写入,我只需要一次访问一个项目,我想通过直接将实例保存到存档(archive << item1 << item2 ...
)并逐个解压缩来对数据集进行流式传输。
另一种选择是从头开始创建一种新的文件格式(像<length><block>
那样简单,其中每个<block>
对应一个Boost.Serialization存档),因为我注意到它看起来不像可以检测到Boost.Serialization中存档的结束而不会捕获异常(我认为应该在存档结束时读取input_stream_error
)。
哪个选项比另一个更好?滥用序列化存档用于流式传输似乎很奇怪,而且具有不重新发明轮子的巨大优势,而文件格式包装档案感觉更干净但更容易出错。
答案 0 :(得分:1)
使用提升序列化进行流式处理不滥用它而不是奇怪的。
事实上,Boost Serialization只有没有,但是流媒体存档界面。所以是的,适用的方法是按照你的说法去做:
archive << number_of_items;
for(auto it = input_iterator(); it != end(); ++it)
archive << *it;
事实上,很少有人阻止你在serialize
方法中做同样的事情。您甚至可以通过将流包装成某些东西(如iterator_range
?)并将Boost序列化扩展为“理解”这些来“自动”,就像它“理解”容器,数组等一样。
文件格式方法肯定是不更清洁(从库的角度来看),因为它破坏了归档格式隔离。序列化库经过精心设计,以避免了解存档表示,并且规避此操作将违反抽象规范。另见