Python,任何替代内存dict的方法都可以减少key=>值访问的内存

2024-10-03 23:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python2.7.x家族时,我有以下问题,我需要一个dict结构,以便在D[key] = value的基础上进行快速访问,因此dict应该是完美的。在

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

对于内存占用非常低的dictpython对象,有没有其他替代方法?在

该值将是一个“id”(字符串),而键将是一个*Unicode*字符串(因此,对于重音符号和其他奇怪的字符,似乎我不能将intern构造用作Unicode)。在

有没有什么工具可以帮助我,即使对散列过程的性能稍有损失(不是太多;)。对于这种设计,什么是常见的良好实践?(我希望避免解决方案依赖于外部数据库,因为该过程已经相当缓慢,而且我需要访问太多这些对象。)


Tags: 对象方法key内存字符串value链接过程
2条回答

您有几种选择:

  • 切换到python3.6。在

字典在3.6版本中有了很大的进步。速度更快,占用空间更小,默认订购,我肯定忘了什么。在

  • 获得更多的记忆。在

很明显,你在一台不符合要求的机器上做了一些受内存限制的事情。买更多的RAM,或者租一个m4.XLargeAWS实例,或者其他什么。在

  • 重新定义问题。在

您是否需要同时在内存中存储所有百万个项目?你是不是一下子就把它们都处理好了?几乎肯定不是。编写更聪明的算法,一次处理数据块,甚至一次处理项目。如果您使这个并发(not necessarily parallel),大多数等待时间将是IO,并且可以很容易地在Python中进行线程化。在

尝试使用生成器表达式和生成器。它们的内存使用量很小。在

  • 使用数据库

数据库是专门用来解决这个问题的。编写一个小的导入程序将数据放入MySQL或MongoDB中,然后用SQL表达您的问题。在

模块^{}提供了一个持久化字典,可以满足您的需要:

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

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

相关问题 更多 >