Python字典内存使用

5

我一直在处理一个涉及从文件中加载相对较大的字典到内存中的项目。该字典有将近200万条目,每个条目(键和值组合)都不到20个字节。磁盘上文件的大小为38 MB。

我的问题是,当我尝试加载字典时,我的程序立即扩展到超过2.5 GB的内存使用量。

这是我用来从磁盘读取字典的代码:

f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()

你尝试过pickle吗? - MattH
键和值的类型是什么? - Winston Ewert
2个回答

7
我认为这个内存用于解析字典语法AST。
对于这种用途,如果您选择cPickle模块而不是使用repr/eval会更好。
import cPickle

x = {}
for i in xrange(1000000):
    x["k%i" % i] = "v%i" % i
cPickle.dump(x, open("data", "wb"), -1)

x = cPickle.load(open("data", "rb"))

-1在转储时表示使用最新的协议,这更加高效,但可能与旧版本的Python不兼容。是否采用此方法取决于您需要进行转储/加载的原因。


你可能还想使用json模块。 - Winston Ewert
Shelve也是一个不错的选择。它专为可能部分存储在磁盘上的大型字典而设计。 - Nathan
谢谢!我还没有机会实现这个,但我稍微了解了一下pickle;看起来它应该可以解决问题。 - dckrooney
我最终使用了cPickle,它完美地解决了问题...内存占用降到了一个更合理的水平,字典加载速度也快得多。谢谢! - dckrooney

0
这可能有点离题,但在处理大文件/数据流时使用生成器表达式也会非常有帮助。 此讨论 很好地解释了它,而 这个演示 改变了我编写程序的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接