1

我创建了一个非常广泛的 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 问题,因为当我并行运行它时出现以下错误: 并行运行时出错:

4

0 回答 0