求助,用py2neo读取节点并进行计算,数量很大导致速度很慢怎么办
发布于 4 个月前 作者 lqpap 393 次浏览 来自 问答

各位大神,本人最近在做一个图谱,其中的节点数达到500万,关系数达到800万。 图谱建好之后,打算通过py2neo连接图谱进行计算,第一步先从图谱中取出满足(n:company)<-[:Share]-()关系的节点,然后通过调用compute_shareratio()对它们进行计算。 用的是公司的Linux平台,里面显示程序的物理内存占用很大,33个G,CPU资源也足够,但是计算的速度很慢。 我怀疑是不是在def init_compute_all_shareratio()函数中第一步取nodes时数据太大,有200多万个节点,可能都在内存里面,导致来回读取速度很慢。所以就想问一下大家是否在下面代码中init_compute_all_shareratio()函数内取nodes时可以有什么好的方法,使得读取节点时候不至于量过大,类似分步读取nodes之类的,可以提高速度,谢谢! 如下是编写的函数:

def init_compute_all_shareratio():  
	nodes = graph.data(f"match (n:COMPANY)<-[:Share]-() return n")
		 for i in tqdm(range(len(nodes)), desc='init_compute_all_shareratio'):
		 	node = nodes[i]['n']
  	  compute_shareratio(node=node) 

def compute_shareratio(node=None, pripid=None):  
	if node:
    	rels = graph.data(f"match {node}<-[r:Share]-() return r")
	if pripid:
    	rels = graph.data(f"match (n:COMPANY)<-[r:Share]-() where n.pripid='{pripid}' return r")
		count = 0
		 for rel in rels:
    			rel = rel['r']
    			count += exchange_rate(rel['subconam'], rel['currency_name'])
		 	for rel in rels:
    			rel = rel['r']
    		if count == 0.000:
        		ratio = 0.000
 else:
        ratio = round(float(rel['subconam']) / count, 6)
  	  rel['share_ratio'] = ratio
    	graph.push(rel)

下图中python3就是我所跑的程序: 微信图片_20180808160823.png 下图中进度条显示速度很慢: 微信图片_20180808160440.png

回到顶部