Я пытаюсь передать данные, сгенерированные следующим фрагментом кода:
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()? Опять же, я не уверен, почему, но это приводит к меньшему размеру файла на диске.
Я хочу свести к минимуму данные, хранящиеся в памяти. Любое руководство будет оценено!