求助,用py2neo读取节点并进行计算,数量很大导致速度很慢怎么办
各位大神,本人最近在做一个图谱,其中的节点数达到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就是我所跑的程序: 下图中进度条显示速度很慢: