我创建了一个非常广泛的 Cython 代码(1300 多行)来执行特定的网络操作,并且让它工作得很好。它基本上接收一堆 numpy 数组和几个 SciPy 稀疏数组,并将结果导出为 dbf 文件。由于我必须在网络上运行多个起点和终点的代码,因此并行化代码是合乎逻辑的(我每个 CPU 使用双 xeon 6 核),但那部分不起作用。
下面是代码中最相关的部分。我基本上为网络上的不同来源一遍又一遍地调用函数“run_one_to_all”,但是当我注释掉串行运行的行并使用多处理行时,我在任务管理器上看到 python 进程打开和关闭但甚至没有加载太多内存(每个进程使用大约 400Mb)。我使用的是 64 位的 windows 专业版、Python 2.7.3 32 位、Numpy、SciPy、Cython 和其他 32 位的 python 库。
我感谢任何指导!
def main():
...
...
results=[]
def adder(value): #Function to hold all the values we will receive for the other cores
#resultados.append(value)
results.append(value)
#Open a pool to perform assignment
cores=mp.cpu_count()
pool=mp.Pool(cores)
for o in range(zones):
if np.sum(CSFFM_matrix[o,:])>0: #If we have something coming from that zone
#q=run_one_to_all(CSFFM_graph,o, CSFFM_matrix[o,:]) #SERIALLY RUNNING
pool.apply_async(run_one_to_all, args=(CSFFM_graph,o,CSFFM_matrix[o,:]), callback=adder) #PARALLELIZED RUNNING
pool.close()
pool.join()
def run_one_to_all(CSFFM_graph,o, CSFFM_matrix):
"""#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#here we should remove ALL the centroids connectors leaving ALL other
#centroids (not origin) from the graph
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"""
#Load the parameters from the config file
number_paths=config.number_paths
zones=config.zones+1
outfolder=config.output_path
#Define the numbr of nodes on the graph
nodes=int(np.max(CSFFM_graph[:,1])+1)
nodes2=int(np.max(CSFFM_graph[:,2])+1)
if nodes2>nodes: nodes=int(nodes2)
Flows=np.zeros(nodes, dtype='float32')
idsgraph=CSFFM_graph[:,0].astype(int)
idsgraph=csr_matrix((idsgraph,(CSFFM_graph[:,1],CSFFM_graph[:,2])), shape=(nodes,nodes))
for d in range(zones):
if CSFFM_matrix[d]>0 and o<>d: #If we have something coming from that zone
name=str(o)+'-'+str(d)
output=open(config.output_path+name+'.log', 'w')
t=clock()
#Start with a new graph cost set
CSFFM_graph[:,8]=CSFFM_graph[:,7]
#Generates DAG
dag=GENERATES_DAG(CSFFM_graph,o,d,number_paths,nodes)
dag2=coo_matrix(dag)
sz=dag2.data.shape[0]
dg=np.empty((sz,2))
dg[:,0]=dag2.row
dg[:,1]=dag2.col
dag2=None
path_file=NestNetwork(dag, o, d, number_paths)
print >>output, str(round(clock()-t,3))+ ' s'
tcw(dg, path_file, nodes, name)
return Flows
这似乎是一个 Cython 问题,因为当我并行运行它时出现以下错误: