【发布时间】:2012-06-28 23:42:16
【问题描述】:
我正在尝试处理以下代码生成的数据:
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 ])
由于字典很大(10000 个键 X 10000 个列表,每个包含 3 个元素),因此很难将其保存在内存中。我一直在寻找一种解决方案,它在生成键:值(以列表的形式)对后立即存储它们。这里建议Writing and reading a dictionary in specific format (Python) 将 ZODB 与 Btree 结合使用。
如果这太天真了,请容忍我,我的问题是,什么时候应该调用transaction.commit() 来提交数据?如果我在内循环结束时调用它,则生成的文件非常大(不知道为什么)。这是一个sn-p:
storage = FileStorage('Data.fs')
db = DB(store)
connection = db.open()
root = connection.root()
btree_container = IOBTree
root[0] = btree_container
for nodes in G.nodes()
btree_container[nodes] = PersistentList () ## I was loosing data prior to doing this
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)
btree_container.setdefault(Gnodes,[]).append([Hnodes, score, -1 ])
transaction.commit()
如果我在两个循环之外调用它会怎样?类似的东西:
......
......
score = SomeOperation on (Gvalue,Hvalue)
btree_container.setdefault(Gnodes,[]).append([Hnodes, score, -1 ])
transaction.commit()
在我调用 transaction.commit() 之前,所有数据是否都会保存在内存中?同样,我不知道为什么,但这会导致磁盘上的文件变小。
我想最小化内存中保存的数据。任何指导将不胜感激!
【问题讨论】:
-
请注意,您可以松开
setdefault调用,也可以将默认的[]替换为PersistentList并将循环放在G.nodes()上以设置您拥有的初始PersistentLists在那里。 -
@MartijnPieters:感谢您的提示!您能否评论一下我最初的查询,即数据何时保存在内存中?例如,如果我在两个循环之外调用 commit,所有数据是否仍会保留在内存中,从而基本上违背了我的目的?
-
耐心点!一个好的答案需要时间。 :-)