1

对不起另一个新手查询:| 根据此处给出的建议, 优化

我需要能够逐步构建字典,即一个键:在 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 ])

然后我需要对这些列表进行排序,但这里给出了答案, 优化(使用生成器表达式代替内部循环是一个选项)
[注意,dic 将包含 10000 个键,每个键与 10000 个元素相关联较小的列表]

由于循环计数器很大,生成的字典很大,我的内存不足。

我如何在生成文件后立即将写入键:值(列表列表)写入文件,这样我就不需要将整个字典保存在内存中。然后我希望能够以相同的格式回字典,例如 dic_score_after_reading[key],返回我正在寻找的列表列表。

我希望按键进行写入和读取:值将大大减轻内存需求。有没有更好的数据结构来做到这一点?我是否应该考虑一个可能像 Buzhug 这样的数据库,它可以让我灵活地访问和迭代与每个键关联的列表?

我目前正在使用cPickle转储整个字典,然后通过 load() 将其读回,但是 cPickle 在一次转储如此大的数据时崩溃。

抱歉,但我不知道做这类事情的最佳实践。谢谢 !

4

1 回答 1

1

您可以考虑将ZODB与包含的BTrees实现结合使用。

给出的是一个类似映射的结构,它将单独的条目分别写入对象存储。您需要使用保存点或普通事务将数据刷新到存储中,但您可以通过这种方式处理大量数据。

于 2012-06-27T19:26:12.453 回答