加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:06:08 所属栏目:Python 来源:网络整理
导读:我需要一个内存高效的数据结构来存储大约一百万个键 – 值对,其中键是大约80字节的字符串,值是大约200字节的字符串,总键和值大小约为280MB.我还需要通过键有效地查找值,最好是哈希映射.内存开销应该尽可能少,例如对于280MB的有用数据,数据结构不应使用超过30
我需要一个内存高效的数据结构来存储大约一百万个键 – 值对,其中键是大约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字典.内存开销非常低(全部在磁盘上).但它也慢得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读