2017-04-27 8 views
1

私がしようとしているのは、どのマルチプロセッシングが自分のデータに最適かをチェックすることです。Pythonマルチプロセス/スレッディングループ。

def __pure_calc(args): 

    j = args[0] 
    point_array = args[1] 
    empty = args[2] 
    tree = args[3] 

    for i in j: 
      p = tree.query(i) 

      euc_dist = math.sqrt(np.sum((point_array[p[1]]-i)**2)) 

      ##add one row at a time to empty list 
      empty.append([i[0], i[1], i[2], euc_dist, point_array[p[1]][0], point_array[p[1]][1], point_array[p[1]][2]]) 

    return empty 

ただ、純粋な関数が6.52秒を取っている:私はこのループをマルチしてみました。

私の最初のアプローチは、multiprocessing.mapた:

from multiprocessing import Pool 

def __multiprocess(las_point_array, point_array, empty, tree): 

    pool = Pool(os.cpu_count()) 

    for j in las_point_array: 
     args=[j, point_array, empty, tree] 
     results = pool.map(__pure_calc, args) 

    #close the pool and wait for the work to finish 
    pool.close() 
    pool.join() 

    return results 

私は他の答えをチェックするとどのようにそれは簡単なはず機能マルチすると:マップ(通話機能、入力) - 行わ。しかし何らかの理由で、私のマルチプルアクセスが自分の入力を除いているわけではないので、scipy.spatial.ckdtree.cKDTreeオブジェクトに添字付け不可能なエラーが発生しています。

だから私はapply_asyncで試してみました:

from multiprocessing.pool import ThreadPool 

def __multiprocess(arSegment, wires_point_array, ptList, tree): 

    pool = ThreadPool(os.cpu_count()) 

    args=[arSegment, point_array, empty, tree] 

    result = pool.apply_async(__pure_calc, [args]) 

    results = result.get() 

それが出て問題に実行します。私のテストデータでは、私はそれを計算することができます6.42秒。

なぜapply_asyncが問題を解決してckdtreeを受け入れ、pool.mapを受け入れないのですか?私はそれを実行させるために変更する必要がありますか?

答えて

1

pool.map(function, iterable)が、それは基本的にitertoolのmapと同じフットプリントを持っています。 iterableの各項目は__pure_calc関数のargsになります。

def __multiprocess(las_point_array, point_array, empty, tree): 

    pool = Pool(os.cpu_count()) 

    args_list = [ 
     [j, point_array, empty, tree] 
     for j in las_point_array 
    ] 

    results = pool.map(__pure_calc, args_list) 

    #close the pool and wait for the work to finish 
    pool.close() 
    pool.join() 

    return results 
:私はあなたがこのに変更される場合があります推測する。この場合