我需要一个内存高效的数据结构来存储大约一百万个键值对,其中键是大约 80 字节的字符串,值是大约 200 字节的字符串,键和值的总大小约为 280MB。我还需要通过键有效地查找值,最好是哈希映射。内存开销应尽可能小,例如对于 280MB 的有用数据,数据结构不应使用超过 300MB 的虚拟内存(包括malloc()
开销和其他一切)。使用模式如下:我们从一个空的数据结构开始,逐渐填充它,从不改变键,从不改变值的长度。另外,数据结构可以支持更改值的长度,但代价是 100% 的值开销(这意味着对于 x 值字节,x 字节可能会暂时浪费在未使用的缓冲区空间中)。
我需要一个纯 Python 模块,或者一个内置的 Python 模块,或者一个最好带有 (C)Python 绑定的 C 实现。如果有可能将整个数据结构序列化到磁盘,并且可以非常快速地读回它,我会更喜欢。
只是为了证明这么小的开销是可能的,我创建了一个开放寻址的简单设计,125 万个元素的哈希表包含指向 1MB 数据块的 4 字节指针,数据块包含键和值长度作为基础-128 个变量。这种设计有一个重要的限制:它不允许在不浪费内存区域的情况下删除或更改对。根据我对 100 万个每个 280 字节的键值对的计算,开销小于 3.6%(10 080 000 字节)。上面的限制更加慷慨,它们允许 20 000 000 字节的开销。
我刚刚找到http://www.pytables.org/,它提供了快速访问和内存高效的数据打包。我必须更仔细地检查它是否适合我的需要。