【问题标题】:the fastest way to load data in C++在 C++ 中加载数据的最快方法
【发布时间】:2014-07-10 03:56:29
【问题描述】:

我的程序中有一个大对象作为输入,我不想每次都初始化它。所以我尝试了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 并且证明它们在性能上没有太大差异。

【问题讨论】:

  • 由于极度缺乏细节,很难说比预先计算和测量更多。预先计算的东西。衡量时间花在哪里(i/o?动态分配?连接事物?)。
  • 您可以通过在处理用户交互的线程中提供响应性并在后台线程中进行序列化/反序列化来给人一种速度的错觉。

标签: c++ serialization boost load deserialization


【解决方案1】:
  1. 这里的速度比较 (how to do performance test using the boost library for a custom library)
  2. 大小权衡Boost C++ Serialization overhead(也有压缩)
  3. EOS Portable Archive (EPA) 用于可移植二进制存档

也就是说,反序列化可能会很慢,具体取决于反序列化的类型。 速度取决于很多因素,很可能与使用的序列化库无关。

  • 某些数据结构具有代价高昂的插入性能特征(看看您是否可以通过提示等保留容量/负载)
  • 您可能有很多动态分配(考虑尝试例如 Boost 的 flat_map 用于连续存储,或者在加载完成时加载未排序和排序数据等)
  • 您可能有非内联(虚拟)调度 - 更喜欢在简单容器中加载/存储 POD 类型

您必须分析您的代码以找出性能瓶颈。

【讨论】:

    【解决方案2】:

    你没有提供太多信息,所以只能给出一个一般性的答案。

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

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

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

    Google 协议缓冲区浮现在脑海中。免费、便携和二进制(所以可能很快)。

    在我看来,ASN.1 是一个非常好的选择,因为有一系列可移植的二进制表示,并且架构语言优于 Google 的协议缓冲区。不过,好的 ASN.1 工具并不是免费的。

    【讨论】:

    • 我本来打算对 FUD-ding 投反对票(“Boost 喜欢”和“你将不得不放弃 boost”)。但是,好吧,答案的其余部分是有用的,即使有点偏颇+0
    • @Sehe,如果您想查看指向 Boost 自己的文档的链接以及指向我在答案中包含的关于 XML 膨胀(= 慢)的无数文章之一的链接那么您可能会关心查看您自己的评论。在实际做这些事情多年后,我选择了 ASN.1,因为它的速度、可移植性和成熟度,尽管工具通常不是免费的。模式语言非常好,有约束(与 GPB 不同),并且似乎有许多不同的语言可用,从 C 到 C# 和 Java。
    • 我的意思是,XML 膨胀是无关紧要的。在您发表评论前大约半小时,我对您的“评论”点的回答就在我的回答中。 (可移植性和跨语言功能很有趣,但它们不能回答问题的任何部分)
    • @IgorR。您链接到的网页标题为“序列化 - 待办事项”,如尚未完成,如不存在。实际上,该页面甚至说示例目录中的那个是不完整的,尤其是在涉及浮点数时。好的,显然有一些东西在那里,但甚至连 Boost 的人都没有声称它已经完成并准备好了。
    猜你喜欢
    • 2011-06-16
    • 2015-10-09
    • 2019-04-27
    • 2021-11-12
    • 1970-01-01
    • 2019-08-20
    • 2014-03-13
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多