我正在尝试处理由以下代码生成的数据:
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 个元素),因此很难将其保存在内存中。我一直在寻找一种解决方案,它在生成键:值(以列表的形式)对后立即存储它们。这里建议,以特定格式(Python)编写和阅读字典,将 ZODB 与 Btree 结合使用。
如果这太天真了,请容忍我,我的问题是,什么时候应该调用transaction.commit()
提交数据?如果我在内循环结束时调用它,则生成的文件非常大(不知道为什么)。这是一个片段:
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() 之前,所有数据都会保存在内存中吗?同样,我不知道为什么,但这会导致磁盘上的文件变小。
我想最小化内存中保存的数据。任何指导将不胜感激 !