2016-03-07 2 views
0

Я имею дело с сеткой сетки 100x100. Я хочу определить его global efficiency, чтобы узнать, насколько эффективно обмен информацией в нем.Python: ошибка памяти с глобальной эффективностью (networkx)

Я использую специальную функцию для вычисления эффективности, а затем применяю ее к своей сети.

Однако я столкнулся с Memory Error, который указывает на линию, где вызывается функция (последняя строка). Это зависит от того, сколько RAM Python использует? Как я могу это исправить?

Код выглядит следующим образом:

from __future__ import print_function, division 
import numpy 
from numpy import * 
import networkx as nx 
import matplotlib.pyplot as plt 
import csv 
from collections import * 
import os 
import glob 
from collections import OrderedDict 

def global_efficiency(G, weight=None): 
    N = len(G) 
    if N < 2: 
     return 0 
    inv_lengths = [] 
    for node in G: 
     if weight is None: 
      lengths = nx.single_source_shortest_path_length(G, node) 
     else: 
      lengths=nx.single_source_dijkstra_path_length(G,node,weight=weight) 

     inv = [1/x for x in lengths.values() if x is not 0] 
     inv_lengths.extend(inv) 

    return sum(inv_lengths)/(N*(N-1)) 

N=100 
G=nx.grid_2d_graph(N,N) 
pos = dict((n, n) for n in G.nodes()) 
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes()) 
nx.relabel_nodes(G,labels,False) 
inds=labels.keys() 
vals=labels.values() 
inds.sort() 
vals.sort() 
pos2=dict(zip(vals,inds)) 
nx.draw_networkx(G, pos=pos2, with_labels=False, node_size = 10) 
eff=global_efficiency(G) 
+0

Yup, извините. Немного мусора ... теперь это исправлено. – FaCoffee

+0

Можете ли вы предоставить фактическое сообщение об ошибке? – Joel

+0

ну, он просто говорит: 'Ошибка памяти:', а затем пробелы – FaCoffee

ответ

2

Я думаю, я знаю, почему у вас есть ошибка памяти. Сохранять все длины всех кратчайших путей для каждого узла может привести к очень большому списку inv_lengths.

Я предлагаю эквивалентное изменение:

def global_efficiency(G, weight=None): 
    N = len(G) 
    if N < 2: 
     return 0 
    inv_lengths = [] 
    for node in G: 
     if weight is None: 
      lengths = nx.single_source_shortest_path_length(G, node) 
     else: 
      lengths=nx.single_source_dijkstra_path_length(G,node,weight=weight) 

     inv = [1/x for x in lengths.values() if x is not 0] 

     # Changes here 
     inv_sum = sum(inv) 
     inv_lengths.append(inv_sum) # add results, one per node 

    return sum(inv_lengths)/(N*(N-1)) 

Это дает тот же результат (я проверил).