2011-05-07 72 views
5

我一直在研究一个涉及从文件中加载相对较大的字典到内存中的项目。字典有不到200万个条目,每个条目(键值和组合值)都低于20个字节。磁盘上的文件大小为38 MB。Python字典内存使用情况

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

下面是我用读字典从磁盘代码:我认为内存是用来解析字典语法AST

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

你试过[pickle](http://docs.python.org/library/pickle.html)吗? – MattH 2011-05-07 21:41:24

+0

键和值的类型是什么? – 2011-05-07 21:48:50

回答

7

对于这种用途,如果您使用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版本兼容的最新协议倾销手段的时候。如果这是一个好主意,取决于你需要转储/加载的原因。

+0

你可能也想使用json模块 – 2011-05-07 21:50:07

+0

Shelve也是一个不错的选择。它专为可能部分存储在磁盘上的大型字典而设计。 – Nathan 2011-05-08 00:20:10

+0

谢谢!我还没有机会实现这一点,但我读了一点咸菜,似乎应该解决这个问题。 – dckrooney 2011-05-08 17:53:11