系统相关
首页 > 系统相关> > Python(或C)中内存有效的字符串到字符串映射

Python(或C)中内存有效的字符串到字符串映射

作者:互联网

我需要一个内存高效的数据结构来存储大约一百万个键 – 值对,其中键是大约80字节的字符串,值是大约200字节的字符串,总键和值大小约为280MB.我还需要通过键有效地查找值,最好是哈希映射.内存开销应该尽可能少,例如对于280MB的有用数据,数据结构不应使用超过300MB的虚拟内存(包括malloc()开销和其他所有内容).使用模式如下:我们从一个空的数据结构开始,我们逐渐填充它,从不更改键,也从不改变值的长度.作为一个加号,数据结构可能支持更改值的长度,代价是100%的值开销(意味着对于x值字节,x个字节可能暂时浪费在未使用的缓冲区空间中).

我需要一个纯Python模块,或一个内置的Python模块,或一个C实现,最好是(C)Python绑定.我更喜欢是否可以将整个数据结构序列化到磁盘,并且可以非常快速地将其读回.

为了证明这么小的开销是可能的,我用open addressing创建了一个简单的设计,125万个元素的哈希表包含到1MB数据块的4字节指针,数据块包含密钥和值长度为base-128 varints.这种设计有一个重要的限制:它不允许在不浪费存储区域的情况下移除或更换线对.根据我的计算,有100万个密钥值对,每个280字节,开销小于3.6%(10 080 000字节).上述限制更加慷慨,它们允许20 000 000字节的开销.

我刚刚找到了http://www.pytables.org/,它提供了快速访问和内存高效的数据打包.我必须仔细检查它以检查它是否符合我的需要.

解决方法:

好的,简单的方法.

使用python字典表示数据结构.我用一百万个随机键值对填充了一个python字典,其中键是80个字符,值是200个字符.它在我的计算机上耗费了360,844 Kb,超出了你的规格不超过300 MB,但无论如何我提供它作为解决方案,因为它仍然非常有效.

这也无法满足您对C API的要求.我不确定你为什么需要C,但由于问题是标记为Python并且没有C标签,我将提供纯Python以查看它是否适合该法案.

关于坚持.使用cPickle模块.它非常快,而且很简单.要保存字典:

cPickle.dump(mydict, "myfile.pkl")

要重新加载字典:

mydict = cPickle.load("myfile.pkl")

第二个简单的想法是使用搁置模块,它基本上是基于磁盘的python字典.内存开销非常低(全部在磁盘上).但它也慢得多.

标签:python,data-structures,hash,map,memory-efficient
来源: https://codeday.me/bug/20190711/1434388.html