【问题标题】:Writing and reading a dictionary in specific format (Python)以特定格式编写和阅读字典(Python)
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的快速回复!让我深入研究一下,因为我不知道这些是如何工作的。
    • @Martjin:我尝试按照您的建议将 ZODB 与 Btree 结合使用,但我遇到了一个小问题。当我打开数据库进行阅读时,我发现有些记录丢失了。具体来说,如上所述,我存储我的 dic。以 Btree 的形式并将其附加到根。 Btree 包含 20 个键,每个键对应于列表列表(如原始问题中所述)。但是,当我关闭数据库后再次打开数据库时,一些列表元素会丢失。每次附加到密钥后,我都在使用 transaction.commit()。
    • 在内部循环中,每次迭代后,我都会做 btree.setdefault(key,[]).append([ref_node, score, -1]) ; transaction.commit() ,以便与每个键关联的列表增量构建。完成后我看到了完整的列表,但是当我重新打开时,我发现列表列表中缺少元素[参考原始帖子]。关于可能出现什么问题的任何想法/建议?提前致谢!
    • 啊,你使用列表;这些是可变的,ZODB 不会注意到更改并且不会提交这些更改。请参阅ZODB not able to commitzodb.org/documentation/guide/…zodb.org/documentation/articles/ZODB1.html#mutable-attributeszodb.org/documentation/guide/modules.html#PersistentList
    • 感谢您的回复!我在transaction.commit() 之前介绍了命令root[0]._p_changed = 1,它在我有少量键(20-30)时起作用。当我跳到更多的键时,>100,我再次观察到同样的问题,在一些键中,一些列表元素丢失了。关于这里发生的任何其他建议?
    猜你喜欢
    • 2013-07-13
    • 2015-10-04
    • 1970-01-01
    • 2014-01-31
    • 2018-07-19
    • 2017-11-21
    • 2012-06-24
    • 2021-04-03
    • 2018-03-12
    相关资源
    最近更新 更多