内存效率高 map<pair<int,int>, set<int>> alternative
Memory efficient map<pair<int,int>, set<int>> alternative
我有大量(1.5亿)整数对,其中每个对与文档ID相关联。我现在的目标是搜索具有相同对的文档。
我的第一个想法是使用对键作为键,将文档ID作为关联值,即 map<pair<int,int>, unordered_set<int>>
std::map
)例如:
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 RAM。因此,我需要一个具有良好性能的替代方案,可以插入可以适合我的记忆。从理论上讲,当没有考虑到间接费用时,我正在使用1500 Million * 3 (PairVal1, PairVal2, Document-ID) * 4 (bytes per Integer) = 18GB
。那么我的问题有什么好选择吗?
这可能是嵌入式数据库的工作
如果您使用的数据量超过RAM,那么您确实需要可以从磁盘上使用的东西。
您可以使用文件系统吗?
名称目录在第一个整数之后,在第二个整数命名的每个命名中创建文本文件,文本文件的每一行都可以是文档ID。
您一定会对所有I/O遭受严重的速度处罚。尽可能快地获取磁盘。存储要求也将大大增长,因为目录名称,文件名和文件内容成为ASCII文本而不是二进制整数。
减少空间的一种解决方案是std::map<std::pair<int,int>, std::unordered_set<int>>
使用std::unordered_map<int, std::unordered_set<int>>
对于将std::pair<int, int>
转换为int
,您必须使用配对函数,例如:
Cantor的配对功能
显然,您仅限于双方使用较小的数字。
最多两个最多16位签名的整数(32767,32767)的映射将为2147418112,仅略短于签名的32位整数的最大值。
其他选项是在B-Tree中创建您自己的索引器,或使用Xapian(例如Xapian)的开源搜索引擎库,它是用C 编写的,并且易于使用。
Xapian是一种高度适应性的工具包,使开发人员可以轻松地将高级索引和搜索设施添加到自己的应用程序中。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'