C++ 地图数据结构的多重映射

C++ 地图数据结构的多重映射,c++,performance,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; struct ltstr { 布尔运算

我正在解析一个文件,它有将近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;
struct ltstr
{
布尔运算符()(常量字符*s1,常量字符*s2)常量
{
返回strcmp(s1,s2)<0;
}
};
多重映射m;

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


关于

不,不是。数十亿,更不用说数以万亿计的记录将无法存储在今天计算机的操作内存中。请记住,单是映射的开销,十亿条记录将消耗32GB,指向键和值的指针将消耗16GB,显然,n是实际数据的键和值的平均长度,其中n是实际数据的平均长度(假设64位系统;在32位系统中,它只有一半,但不适合3GB的地址空间限制)。世界上只有极少数大型服务器具有如此大的内存量

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

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

  • 外部哈希库,如ndbm。它们只提供map的外部模拟,这是最简单的,但API是基于C的
  • 提供了几个外部容器的外部变体以及在这些容器上工作的算法。最大的优点是API与标准库集合相同
  • 对于更复杂的数据操作,只需使用。同样,更快速、更复杂的数据处理也更容易用SQL表达

效率
与之相比?在内存或速度方面是否高效?无序版本应该更快,但需要更多内存。你应该尝试这两种方法,并从第一手实验中决定你没有告诉我们关于你的数据的几乎足够的信息。然而,向multimap添加10亿个条目可能会占用10 GB的内存,甚至更多。这对你的系统合适吗?@Karthik T我需要在内存和速度两方面都高效。请注意,这些定义使用指针值作为键,这可能不是你想要的。