什么是提升序列化地图加载时间?

Posted

技术标签:

【中文标题】什么是提升序列化地图加载时间?【英文标题】:What is boost serialized map load time? 【发布时间】:2018-01-06 21:49:52 【问题描述】:

如果地图在 boost 中是二进制序列化的,是加载 nlogn 的时间还是 n ?

如果 map 只是一次写入一个元素,那么加载 n 项似乎需要 nlogn,因为我们正在插入 n 项并且每个项都需要 logn 时间。

但我想知道是否可以以与内存布局和指针编组匹配的格式编写映射。所以加载它然后我认为需要 n 时间。本质上是正在加载内存布局。

有人有这方面的经验吗?

【问题讨论】:

时间不是以nnlogn 衡量的。如果你想测量实际时间,你只需要一些分析器或至少像 chrono::high_resolution_clock 这样的东西。 如果您包含代码,我们实际上可以建议改进性能的更改。现在我们甚至在猜测您的地图包含什么。没用 【参考方案1】:

我没有查看源代码,但是...

如果我正在为std::map编写序列化代码,我会记得在写入数据时,它将按比较函数排序(通常是std::less)。

然后我会记得std::map::insert 有一个版本,允许我指定关于从何处开始搜索插入点的提示。

回顾从档案中读取的数据是按“升序”顺序排列的,我需要做的就是:

while(read_count--)

  std::pair<K,V> entry;
  archive >> entry;
  mymap.insert(std::end(mymap), entry);

所以实际上它是线性时间。

【讨论】:

【参考方案2】:

就像理查德说的,但我更喜欢boost::container::flat_map。这具有允许您插入已知已排序的范围的构造函数:http://www.boost.org/doc/libs/1_66_0/doc/html/boost/container/flat_map.html#idp38577632-bb

我认为默认序列化没有利用这一点,因此您可能希望基于此推出自己的序列化。

作为奖励:如果您的键/值对是自包含的和 POD,您可以将它们序列化。

【讨论】:

以上是关于什么是提升序列化地图加载时间?的主要内容,如果未能解决你的问题,请参考以下文章

Yaml-cpp(新 API):在序列中混合地图和标量的问题

杰克逊:地图的反序列化

在没有包装器的情况下提升指向基元的指针的序列化

提升反序列化优化?

尽管结构已序列化,但提升错误“结构没有名为'序列化'的成员”

在 pyspark 地图逻辑中使用 sparksql 不起作用