我一直在研究一个涉及从文件中将相对较大的字典加载到内存中的项目。字典的条目不到200万条,每个条目(键和值组合)不到20个字节。磁盘上文件的大小为38 MB。
我的问题是,当我尝试加载字典时,我的程序会立即扩展到超过2.5 GB的内存。
以下是我用来从磁盘读取字典的代码:
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
答案 0 :(得分: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版本向后兼容的最新协议。如果这是一个好主意,取决于你需要转储/加载的原因。
答案 1 :(得分:0)
这可能有点偏离主题,但在处理大文件/数据流时,它也可以极大地帮助使用生成器表达式。
This discussion explains it very well和this presentation改变了我编写程序的方式。