地图数据结构的多图

时间:2013-01-10 07:40:11

标签: c++ performance

我正在解析一个有近10亿(或可能是万亿)记录的文件。我正在使用

 struct ltstr
 {
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
 };

 multimap<char*, map<char*, char*, ltsr>,ltstr > m;

这是在C ++中使用上述数据结构的有效方法吗?

此致

1 个答案:

答案 0 :(得分:1)

不,不是。数十亿,更不用说数以万亿计的记录不适合当今计算机的操作记忆。请记住,十亿条记录仅占地图开销的32 GB,另外16条用于指向键和值的指针,显然 n 更多GB,其中 n 是平均值密钥的长度和实际数据的值(假设是64位系统;在32位系统中,它只有一半,但它不适合3 GB的地址空间限制)。世界上只有少数大型服务器具有如此大的内存。

处理如此大量数据的唯一选择是小批量处理它们。如果可以分别对每个元素进行处理,则一次只加载一个元素,处理它并丢弃它。无论数据大小如何,流处理总是更快,因为它只需要固定数量的内存,因此可以有效利用CPU缓存。

如果无法像那样处理,因为需要特定的顺序或者您需要查找条目或其他内容,您需要将数据准备到适当的外部(磁盘上)结构。即使用外部合并排序(将分区写入临时文件)对它们进行排序,使用B树或散列等对它们进行索引。这是很多的工作。但幸运的是,有几个库实现了这些算法。我建议:

  • *DMB外部哈希库,如GDBMBerkeley DB或ndbm。这些只提供了外部的地图模拟,最简单,但API是基于C的。
  • stxxl提供了几个外部容器和算法的外部变体。最大的优点是API与标准库集合相同。
  • 对于更复杂的数据操作,只需转到sqlite。它就像在SQL中更容易表达一样快,更复杂的数据处理。