更新大密集图的边缘属性

时间:2014-06-21 21:20:12

标签: graph networkx

我有一个大而密集的图,其边缘属性使用以下代码更新。简而言之,我根据从其他字典(degdict,pifeadict,nodeneidict等)获取的值的一些计算来设置边缘属性。我最小的图有1500万条边。执行到达此阶段时,CPU使用率下降至10%,内存上升至69%。对于大型图形,我的进程因内存使用率达到90%而被杀死。我不确定哪里出了问题。

除了解决这个内存问题之外,我还需要加速这个循环,如果可能的话 - 也许是一个更新边缘属性的并行解决方案。请提出解决方案。

    for fauth, sauth in Gcparam.edges_iter():
        first_deg = degdict[fauth]
        sec_deg = degdict[sauth]
        paval = float(first_deg*sec_deg)/float(currmaxdeg * \
                                                         currmaxdeg)
        try:
            f2 = dmpdict[first_deg][sec_deg]
        except KeyError:
            f2 = 0.0
        try:
            pival = pifeadict[first_deg][sec_deg]
        except KeyError:
            pival = 0.0
        delDval = float(abs(first_deg - sec_deg))/(float(currmaxdeg)*delT)
        f5 = calc_comm_kws(fauth, sauth, kwsdict)
        avg_ndeg = getAvgNeiDeg(fauth, sauth, nodeneidict, currmaxdeg)/delT
        prop = getPropensity(fauth, sauth, nodeneidict, currmaxdeg, Gparam)/delT
        tempdict = {'years':[year], 'pa':[paval],\
                        'dmp':[f2], 'pi':[pival], 'deld':[delDval],\
                        'delndeg':[avg_ndeg], 'delprop' :[prop],\
                        'ck' :[f5]
                       }
        Gcparam[fauth][sauth].update(tempdict)

1 个答案:

答案 0 :(得分:1)

您可以估算每条边上数据所需的存储量,如下所示:

In [1]: from pympler.asizeof import asizeof

In [2]: tempdict = {'years':[1900], 'pa':[1.0],\
                        'dmp':[2.0], 'pi':[3.0], 'deld':[7],\
                        'delndeg':[3.4], 'delprop' :[7.5],\
                        'ck' :[22.0]
}

In [3]: asizeof(tempdict)
Out[3]: 1000

所以看起来1000字节是你正在做的事情的下限。乘以总数的边数。 NetworkX还有一些节点和边缘数据结构的开销,这取决于您用于节点的对象类型。整数最小。