以特定格式编写和阅读字典(Python)

时间:2012-06-27 19:22:30

标签: python file loops dictionary

对不起另一个新手查询:|建立在这里给出的建议,  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],返回我正在寻找的列表列表。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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