内存效率高 map<pair<int,int>, set<int>> alternative

Memory efficient map<pair<int,int>, set<int>> alternative

本文关键字:int gt lt alternative set pair 效率高 内存 map      更新时间:2023-10-16

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

我的第一个想法是使用对键作为键,将文档ID作为关联值,即 map<pair<int,int>, unordered_set<int>>

使用hash-map( 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是一种高度适应性的工具包,使开发人员可以轻松地将高级索引和搜索设施添加到自己的应用程序中。