Python,内存字典的替代方案,为key =>值访问消耗更少的内存

时间:2018-02-06 08:02:44

标签: python dictionary memory-efficient

使用Python 2.7.x系列,我有以下麻烦,我需要有一个dict结构,可以在D[key] = value的基础上快速访问,所以dict应该是完美的。

顺便说一下,我有MemoryError,因为我需要在内存中有两个对象系列,它们都是巨大的(数亿)并且是链接的:这个dict也是一个链接树对象的结构(实际上)尝试)。

有没有替代dict python对象具有非常低的内存占用?

该值将是" id" (字符串),键将是一个* Unicode *字符串(所以使用强调的和其他奇怪的字符,似乎我不能将intern构造用作Unicode)。

是否有任何工具可以帮助我,即使在散列过程中略微失去性能(不是太多;))。这种设计的常见良好做法是什么? (我想避免依赖外部数据库的解决方案,因为这个过程已经很慢了,而且我需要过多的这些对象访问。)

2 个答案:

答案 0 :(得分:0)

模块shelve提供了一个应该满足您需求的持久词典:

>>> import shelve
>>> db = shelve('cache.db')
>>> db = shelve.open('cache.db')
>>> db['id1'] = u'string data'
>>> db['id1']
'string data'

您可以像普通字典一样使用它,但它将所有数据存储在文件(数据库)中的键值存储中。这可能足以满足您的需求,因为后台正在进行一些缓存。尝试它的努力应该相当小。

答案 1 :(得分:0)

您有几种选择:

  • 切换到Python 3.6。

词典在3.6中得到了更好的表现。更快,更小的占地面积,默认排序,我确定我忘了什么。

  • 获得更多记忆。

你显然在一台不符合要求的机器上做了记忆的事情。购买更多内存,或租用m4.xlarge AWS实例,或其他东西。

  • 重新定义问题。

您是否一次需要内存中的所有百万项?你是在一起工作吗?几乎绝对不是。更智能地编写算法,一次处理数据块,甚至一次处理项目。如果你使这个并发(not necessarily parallel),大部分等待时间将是IO,并且可以很容易地在Python中进行线程化。

尝试一般使用生成器表达式和生成器。他们的内存使用很少。

  • 使用数据库

数据库专门用于解决此问题。写一个小的导入器将你的数据丢入MySQL或MongoDB,然后在SQL中表达你的问题。