适用于经常变化的大型数据集的最佳数据结构

时间:2018-07-09 23:56:53

标签: c++ performance data-structures apache-kafka bigdata

这是场景:

  1. 我们有一个包含2,000,000个数据点的大型数据模型。
  2. 每个数据包括:一个度量值(整数或浮点数),一个时间戳记,一个质量枚举(好,坏,未知)和唯一的ID。
  3. 测量更新通过Kafka进来,大约每秒更新20%的测量。
  4. 每隔几秒钟,算法就会针对当前的测量模型运行。此时内存快照已锁定
  5. 算法完成后,将使用在kafka总线上等待的更改来更新测量模型。

用于测量模型的内存快照的最佳数据结构(性能)是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

因此,每个基准面(基本上)都是以下结构:

function transpose(jsonObj, str) {
  let data = {};
  if(validate(str))
  {
    data = jsonObj[str];
    runFile(data); //runFile expects data to be a JSON type
  }
  ...
}

这是40个字节的大小。如果您有200万个磁盘,那么总计将高达80兆字节。即使您的数据结构有4倍的开销,也不是完全“大”的数据。一些Xeon CPU几乎可以将其容纳在其L3缓存中


至少,您需要具有快速ID查找的数据结构。因此,哈希表(std :: unordered_map)是显而易见的选择。但是,您可能可以利用一些东西来帮助您滚动自己的哈希表实现,而该实现可能会比这更好。

  1. 如果您的ID是连续的(而不是我所假设的Guids),则可以使用 array 而不是哈希表,该表具有不需要哈希的明显优势功能。只需使用索引即可。
  2. 如果您有固定(或有限)数量的数据点,则可以将实际数据点存储在连续的内存中。在负载因子固定的情况下使用开放地址哈希表(unlike std::unordered_map)可能也会更快。测试将指向元素的指针和元素本身都存储在表中。
  3. 如果您可以拥有Kafka结果的所有权,那么复制指针而不是完整结构可能会更好。内存碎片可能会使速度变慢,但也可能不会。
  4. 如果您知道某些度量变得“热门”(即经常更新),则可以在连续存储和哈希表链中对其重新排序,可以改善缓存的位置。
  5. 如果您知道在更新过程中不会更改哈希表,则可以对更新进行分区并对其进行并行化,而无需锁定。

在所有情况下,都应针对标准库实现对这些潜在的改进(如果适用)进行测试。没有测量性能,就不可能给出确定的答案。