我有一个大而密集的图,其边缘属性使用以下代码更新。简而言之,我根据从其他字典(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)
答案 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还有一些节点和边缘数据结构的开销,这取决于您用于节点的对象类型。整数最小。