内存高效映射<pair <int,int>,set <int>&gt;替代

时间:2016-06-14 14:58:20

标签: c++ dictionary hashmap minhash

我有大量(1500万)整数对,其中每一对都与文档ID相关联。我现在的目标是搜索具有相同对的文档。

我的第一个想法是使用哈希映射(std::map),使用对值作为键,将文档ID作为关联值,即map<pair<int,int>, unordered_set<int>>

例如:

Document1

 - pair1: (3, 9)
 - pair2: (5,13)

Document2

 - pair1: (4234, 13)
 - pair2: (5,13)

map<pair<int,int>, unordered_set<int>> hashMap
hashMap[{3, 9}].insert(1)
hashMap[{5, 13}].insert(1)

hashMap[{4234, 13}].insert(2)
hashMap[{5, 13}].insert(2)

会导致

Key(3,9) = Documents(1) 
Key(5,13) = Documents(1,2) 
Key(4234,13) = Documents(2)

我现在的问题是,这需要大量的内存,超过了我可用的24 GB内存。因此,我需要一个具有良好性能的替代插件和查找,它可以适合我的记忆。理论上,我在使用1500 Million * 3 (PairVal1, PairVal2, Document-ID) * 4 (bytes per Integer) = 18GB时没有考虑间接费用。那么我的问题有什么好的选择吗?

3 个答案:

答案 0 :(得分:2)

这可能是嵌入式数据库的工作,例如SQLite或BerkeleyDB或Tokyo Cabinet。

如果您使用的数据量超过了RAM,那么您确实需要一些可以在磁盘上运行的数据。

答案 1 :(得分:0)

您可以使用文件系统吗?

在第一个整数之后命名目录,在每个为第二个整数命名的文件中创建文本文件,文本文件的每一行都可以是文档ID。

您必须对所有I / O进行严重的速度惩罚。尽可能快地获取磁盘。存储需求也将显着增长,因为目录名称,文件名和文件内容变为ascii文本而不是二进制整数。

答案 2 :(得分:0)

减少空间的一种解决方案是std::map<std::pair<int,int>, std::unordered_set<int>>使用std::unordered_map<int, std::unordered_set<int>>

要将std::pair<int, int>转换为int,您必须使用配对功能,例如:

Cantor’s Pairing Function

显然,你只能在你的配对中使用较小的数字。

  

两个最大16位有符号整数(32767,32767)的映射将为2147418112,这与有符号32位整数的最大值相差不了。

其他选项是基于B树创建自己的索引器,或者使用像xapian这样的开源搜索引擎库,它是用C ++编写的,并且使用起来快速且简单。

  

Xapian是一个高度适应性强的工具包,允许开发人员轻松地将高级索引和搜索工具添加到他们自己的应用程序中。