串行代码运行良好,但并行时不行

时间:2013-06-02 06:09:18

标签: python parallel-processing multiprocessing cython

我创建了一个非常广泛的Cython代码(1300多行)来执行特定的网络操作,并使其工作得很好。它基本上接收了一堆numpy数组和几个SciPy稀疏数组,并将结果导出为dbf文件。    由于我必须在网络上运行多个起始点和目标点的代码,因此并行化代码是合乎逻辑的(我使用的是每个CPU使用双至强6核心),但该部分无效。

下面是代码中最相关的部分。我基本上是在网络上的不同来源上反复调用函数“run_one_to_all”,但是当我注释掉串行运行的行并使用多处理行时,我在我的任务管理器上看到python进程被打开和关闭但是甚至没有加载太多内存(每个进程使用大约400Mb)。    我在Windows专业版64位,Python 2.7.3 32位,Numpy,SciPy,Cython和其他python库都在32位。

我感谢任何指导!!!

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问题,因为当我并行运行时出现以下错误: Error when running in parallel:

0 个答案:

没有答案