地图数据结构的Multimap
multimap of map data structure
我正在解析一个有近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++中使用上述数据结构是否有效?
对
不,它不是。数十亿,更不用说数万亿的记录将无法容纳今天计算机的操作存储器。请记住,十亿条记录仅用于映射开销就消耗32 GB,另外16 GB用于指向键和值的指针,显然n更多的GB,其中n是实际数据的键和值的平均长度(假设是64位系统;在32位系统中,它只有一半,但它不适合3 GB的地址空间限制)。世界上只有少数大型服务器拥有如此多的内存。
处理如此大量的数据的唯一选择是小批量处理它们。如果可以对每个元素分别进行处理,则每次只加载一个元素,处理它并丢弃它。无论数据大小如何,流处理总是更快,因为它只需要固定数量的内存,因此可以有效地利用CPU缓存。
如果不能这样处理,因为需要特定的顺序,或者需要查找条目等,则需要将数据准备到适当的外部(磁盘上)结构中。例如,使用外部归并排序(将分区写入临时文件)对它们进行排序,使用b树或哈希或诸如此类的索引。这是一个大量的工作。但幸运的是,有几个库实现了这些算法。我建议:
- A *DMB,外部哈希库,如GDBM, Berkeley DB或ndbm。这些只是提供map的外部模拟,最简单,但API是基于c的。
- stxxl提供了几个外部容器的外部变体和在它们上工作的算法。最大的优点是API与标准库集合相同。
- 对于更复杂的数据操作,请使用sqlite。它同样快速,更复杂的数据处理更容易用SQL表达。
相关文章:
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 应该使用multimap、boost::bimap、multiset或任何其他数据结构
- 地图数据结构的Multimap