【发布时间】:2012-06-27 19:22:30
【问题描述】:
对不起,另一个新手查询:|以这里给出的建议为基础, optimizing
我需要能够逐步构建字典,即一个键:在 for 循环中一次取值。具体来说,字典看起来像(N 个键,每个值是一个列表列表。较小的内部列表有 3 个元素):
dic_score ={key1:[ [,,], [,,], [,,] ...[,,] ], key2:[ [,,], [,,], [,,] ..[,,] ] ..keyN:[[,,], [,,], [,,] ..[,,]]}
这个 dic 是从下面的范式生成的,一个嵌套的 for 循环。
for Gnodes in G.nodes() # Gnodes iterates over 10000 values
Gvalue = someoperation(Gnodes)
for Hnodes in H.nodes() # Hnodes iterates over 10000 values
Hvalue =someoperation(Hnodes)
score = SomeOperation on (Gvalue,Hvalue)
dic_score.setdefault(Gnodes,[]).append([Hnodes, score, -1 ])
然后我需要对这些列表进行排序,但这里给出了答案,optimizing(使用生成器表达式代替内部循环是一种选择)
[请注意,该 dic 将包含 10000 个键,每个键与 10000 个较小列表的元素相关联]
由于循环计数器很大,因此生成的字典很大,内存不足。
如何编写将 Key:value(列表的列表)生成到文件后立即写入,这样我就不需要将整个字典保存在内存中.然后,我希望能够以相同的格式读取字典,例如 dic_score_after_reading[key],返回我正在查找的列表列表。
我希望按 key:value 进行写入和读取会大大降低内存需求。有没有更好的数据结构来做到这一点?我是否应该考虑一个可能像 Buzhug 这样的数据库,它可以让我灵活地访问和迭代与每个键关联的列表?
我目前正在使用 cPickle 转储整个字典,然后通过 load() 将其读回,但是 cPickle 在一次转储如此大的数据时崩溃。
抱歉,但我不知道做这类事情的最佳做法。谢谢!
【问题讨论】:
标签: python file loops dictionary