我一直在研究一个涉及从文件中加载相对较大的字典到内存中的项目。字典有不到200万个条目,每个条目(键值和组合值)都低于20个字节。磁盘上的文件大小为38 MB。Python字典内存使用情况
我的问题是,当我尝试加载字典时,我的程序立即扩展到超过2.5千兆字节的内存使用。
下面是我用读字典从磁盘代码:我认为内存是用来解析字典语法AST
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
我一直在研究一个涉及从文件中加载相对较大的字典到内存中的项目。字典有不到200万个条目,每个条目(键值和组合值)都低于20个字节。磁盘上的文件大小为38 MB。Python字典内存使用情况
我的问题是,当我尝试加载字典时,我的程序立即扩展到超过2.5千兆字节的内存使用。
下面是我用读字典从磁盘代码:我认为内存是用来解析字典语法AST
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
。
对于这种用途,如果您使用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版本兼容的最新协议倾销手段的时候。如果这是一个好主意,取决于你需要转储/加载的原因。
这可能有点偏离主题,但它也可以帮助在处理大文件/数据流时大量使用生成器表达式。
This discussion explains it very well和this presentation改变了我写我的程序的方式。
你试过[pickle](http://docs.python.org/library/pickle.html)吗? – MattH 2011-05-07 21:41:24
键和值的类型是什么? – 2011-05-07 21:48:50