В проекте с открытым исходным кодом я пытаюсь использовать NetworkX, чтобы найти аттракторы Graph (называемые State Transition Graph). Дело в том, что для почти 2 ** 33 циклов функция с различными входами возвращает список кортежей (почти 5000 кортежей), в которых каждый кортеж содержит ребра, которые необходимо подать на график networkx. Это выглядит следующим образом:
def BigGraph:
#Do some computations
G = nx.DiGraph()
for i in range(2**33):
#Do some computations
edges = func(different initial conditions)
G.add_edges_from(edges)
Как уже упоминалось ранее, поскольку число ребер растет быстрее, а также тот факт, что график NetworkX занимает много памяти в оперативной памяти, я пытался непрерывно читать и записывать в Файл маринада выглядит следующим образом:
def BigGraph:
#Do some computations
G = nx.DiGraph()
nx.write_gpickle(G, 'graph.gpickle')
for i in range(2**33):
#Do some computations
edges = func(different initial conditions)
G = nx.read_gpickle('graph.gpickle')
G.add_edges_from(edges)
nx.write_gpickle(G, 'graph.gpickle')
После этого я осознал, что при экспоненциальном ребре go чтение и запись в маринаде отразится на мне много времени и памяти. Я попробовал то, что было предложено здесь , но, как уже упоминалось в этом вопросе, мне не нужно часто работать с Graph. В конечном счете, все, что мне нужно сделать, это добавить МНОЖЕСТВО ребер в граф networkx со сложностью O (1), если это возможно.
Есть ли в любом случае, в котором я могу сделать это, чтобы сэкономить много времени, а также не будет проблемой для моей памяти (у меня 8 ГБ ОЗУ). Я открыт для использования любых внешних библиотек, если они бесплатны и могут эффективно выполнять то, что я намеревался сделать.
РЕДАКТИРОВАТЬ : я хотел знать, есть ли способ в котором мы можем использовать что-то вроде memmap, чтобы хранить мой график на моем жестком диске и находить привлекающие компоненты графика. Использование NetworkX является обязательным для меня.