流增加.序列化档案

Streaming Boost.Serialization archives

本文关键字:档案 序列化 增加      更新时间:2023-10-16

我有一个大型数据集(100k+项),我想使用Boost.Serialization进行序列化。

现在,当处理更大的数据集时,整个数据集不再适合内存了(我目前在存档中存储了一个std::map和所有数据)。因为我既不需要随机读写,一次只需要访问一个项目,所以我考虑通过直接将实例保存到存档(archive << item1 << item2 ...)并逐个解包来流式传输数据集。

另一种选择是从头开始开发一种新的文件格式(像<length><block>这样简单的文件格式,其中每个<block>对应一个Boost。序列化归档),因为我注意到在Boost中似乎无法检测归档的结束。没有捕获异常的序列化(我认为,在读取超过归档结束时应该抛出input_stream_error)。

哪个选项更可取?在流媒体中滥用序列化归档看起来很奇怪,但它有一个很大的优点,就是不用重新发明轮子,而文件格式包装归档感觉更干净,但更容易出错。

为流使用boost序列化是而不是滥用它,也不奇怪。

实际上,Boost序列化只有,只有流存档接口。所以,是的,适用的方法是像你说的那样做:

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

事实上,在你的serialize方法中,几乎没有什么可以阻止你做同样的事情。你甚至可以通过将你的流包装成一些东西(比如iterator_range ?)并扩展Boost序列化来"理解"这些,就像它"理解"容器,数组等,使它"自动"。

文件格式方法肯定是而不是更干净(从库的角度来看),因为它破坏了归档格式隔离。序列化库经过精心设计,以避免了解归档表示,而规避这一点将破坏抽象。也看到

  • Boost c++序列化开销
  • 为什么二进制文件与文本相比差异很大?