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

以特定格式编写和阅读词典(Python),python,file,loops,dictionary,Python,File,Loops,Dictionary,抱歉,另一个新手提问:|根据这里给出的建议, 我需要能够增量地构建一个字典,即在for循环中一次构建一个key:value。具体来说,字典看起来像(N个键,每个值都是列表列表。较小的内部列表有3个元素): 此dic是根据以下范例生成的,即嵌套for循环 for Gnodes in G.nodes() # Gnodes iterates over 10000 values Gvalue = someoperation(Gnodes) for Hnodes in H.

抱歉,另一个新手提问:|根据这里给出的建议,

我需要能够增量地构建一个字典,即在for循环中一次构建一个key:value。具体来说,字典看起来像(N个键,每个值都是列表列表。较小的内部列表有3个元素):

此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个较小列表元素关联]

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

如何将生成的Key:value(列表列表)写入文件,这样就不需要将整个字典保存在内存中。然后,我希望能够阅读以相同的格式返回词典,例如,在阅读[key]后返回dic_score_,返回我要查找的列表列表

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

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


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

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


这提供了一个类似映射的结构,它将单个条目分别写入对象存储。您需要使用或plain将数据刷新到存储中,但您可以通过这种方式处理大量数据。

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


这提供了一个类似映射的结构,它将单个条目分别写入对象存储。您需要使用或纯文本将数据刷新到存储中,但您可以通过这种方式处理大量数据。

感谢您的快速响应!让我深入探讨一下,因为我不知道这些是如何工作的。@Martjin:正如你所建议的,我试图将ZODB与Btree结合起来实现,但我遇到了一个小问题。当我打开数据库进行阅读时,我发现一些记录丢失了。具体来说,如上所述,我存储我的dic。以Btree的形式,并将其附加到根上。Btree包含20个键,每个键对应于列表的列表(如原始问题中所述)。但是,在关闭数据库一次之后,当我再次打开数据库时,一些列表元素丢失了。每次追加到键后,我都使用transaction.commit()。在内部循环中,每次迭代后,我都执行btree.setdefault(键,[])。追加([ref_node,score,-1]);commit(),以便以增量方式生成与每个键关联的列表。当我完成后,我看到了完整的列表,但当我重新打开时,我发现列表中缺少元素[参考原始帖子]。关于可能出现的问题,有什么想法/建议吗?提前谢谢!啊,你用名单,;这些是可变的,ZODB不会注意到这些更改,也不会提交这些更改。请参阅、和。感谢您的回复!我在
transaction.commit()之前引入了命令
root[0]。\u p\u changed=1
,当我有少量密钥(20-30)时,该命令有效。当我跳到更多的键,>100时,我再次观察到同样的问题,在一些键中,一些列表元素丢失。关于这里发生的事情还有其他建议吗?谢谢你的快速回复!让我深入探讨一下,因为我不知道这些是如何工作的。@Martjin:正如你所建议的,我试图将ZODB与Btree结合起来实现,但我遇到了一个小问题。当我打开数据库进行阅读时,我发现一些记录丢失了。具体来说,如上所述,我存储我的dic。以Btree的形式,并将其附加到根上。Btree包含20个键,每个键对应于列表的列表(如原始问题中所述)。但是,在关闭数据库一次之后,当我再次打开数据库时,一些列表元素丢失了。每次追加到键后,我都使用transaction.commit()。在内部循环中,每次迭代后,我都执行btree.setdefault(键,[])。追加([ref_node,score,-1]);commit(),以便以增量方式生成与每个键关联的列表。当我完成后,我看到了完整的列表,但当我重新打开时,我发现列表中缺少元素[参考原始帖子]。关于可能出现的问题,有什么想法/建议吗?提前谢谢!啊,你用名单,;这些是可变的,ZODB不会注意到这些更改,也不会提交这些更改。请参阅、和。感谢您的回复!我在
transaction.commit()之前引入了命令
root[0]。\u p\u changed=1
,当我有少量密钥(20-30)时,该命令有效。当我跳到更多的键,>100时,我再次观察到同样的问题,在一些键中,一些列表元素丢失。关于这里发生了什么,还有其他建议吗?
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 ])