用C ++加载数据的最快方法

时间:2014-07-10 03:56:29

标签: c++ serialization boost load deserialization

我的程序中有一个大对象作为输入,我不想每次都初始化它。所以我尝试了Boost来序列化它(序列化后对象是13.6 MB)。但性能不是很好。它仍然需要大约一分钟来加载和反序列化它。所以我想知道有什么方法可以让这个过程更快吗?我提出任何提示或建议!提前谢谢你

这是保存功能:

void mysave(){
    dataprepocess dp();//dp is the object i want to save and load
    ofstream ofs("dp.dat", ios::binary);
    {
        boost::archive::binary_oarchive oa(ofs);
        // write class instance to archive
        oa << dp;
        // archive and stream closed when destructors are called
    }
    cout<<"saving finished"<<endl;
}

这是我的加载功能,

void myload(dataprepocess& dp){
  ifstream ifs1("dp_b.dat", ios::binary);
  {
    boost::archive::binary_iarchive ia1(ifs1);
    ia1 >> dp;
  }
  ifs1.close();
}

我已经尝试过text_archive和binary_arhive,它证明了它们在性能方面没有太大差异。

2 个答案:

答案 0 :(得分:2)

  1. 速度比较(how to do performance test using the boost library for a custom library
  2. 尺寸权衡Boost C++ Serialization overhead(也有压缩)
  3. EOS Portable Archive (EPA)用于便携式二进制存档
  4. 也就是说,反序列化可能很慢,具体取决于反序列化的类型。 速度取决于很多因素,很可能与使用的序列化库无关。

    • 某些数据结构具有代价高昂的插入性能特征(请参阅是否可以通过提示保留容量/负载等)
    • 您可能需要进行大量动态分配(考虑尝试使用Boost&#39; flat_map进行连续存储,或者在加载完成后加载未分类和排序数据等。)
    • 您可能有非内联(虚拟)调度 - 更喜欢在简单容器中加载/存储POD类型
      

    您必须对代码进行分析,以找出性能瓶颈。

答案 1 :(得分:0)

您没有提供太多信息,因此只能给出一般答案。

据我所知,Boost喜欢序列化为XML, text, or a non-portable binary archives。在这三个中,我猜二进制存档是最快的,但看起来它无法从一台计算机可靠地传递到另一台计算机(Boost将其描述为非便携式)。二进制序列化通常比XML之类的文本更快,相比之下总是比较慢。

因此,如果您已经使用XML存档格式,则可以通过切换到二进制存档格式来提高速度。

如果您需要存档是可移植的,那么您将不得不放弃Boost并使用其他内容。

Google协议缓冲会让人想起。免费,便携和二进制(所以可能很快)。

ASN.1在我看来是一个非常好的选择,因为有一系列可移植的二进制表示,而且模式语言优于Google的Protocol Buffers。好的ASN.1工具不是免费的。