2016-10-03 5 views
1

私は長いリストのユーザー(約200,000)と対応するデータフレームdfの属性を持っています。今度は、ユーザの対の類似性を測定するforループを書いてみたいと思います。コードは次の通りです:Python for-loopでマルチプロセッシング手法を適用するにはどうすればいいですか?

df2record = pd.DataFrame(columns=['u1', 'u2', 'sim']) 
for u1 in reversed(user_list): 
    for u2 in reversed(list(range(1, u1))): 
     sim = measure_sim(df[u1], df[u2])) 
     if sim < 0.6: 
      continue 
     else: 
      df2record = df2record.append(pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim']), ignore_index=True) 

これをマルチプロセッシングのループで実行したいと思います。私はチュートリアルを読んでいます。しかし、私はまだそれを適切に処理する考えはありません。 6のように、最初に妥当な数のプロセスを設定する必要があるようです。そして、私は各ループを1つのプロセスに供給する必要があります。しかし、問題は、特定のプロセスのタスクが完了して新しいループを開始できるようになったことをどのように知ることができるかです。これで私を助けてくれますか?事前にありがとう!

答えて

1

あなたは与えられた反復可能な上プロセスのプールをマップする方法mapを提供するmultiprocessing.Poolを使用することができます。次にコード例を示します。

def pairGen(): 
    for u1 in reversed(user_list): 
     for u2 in reversed(list(range(1, u1))): 
      yield (u1, u2) 

def processFun(pair): 
    u1, u2 = pair 
    sim = measure_sim(df[u1], df[u2])) 
    if sim < 0.6: 
     return None 
    else: 
     return pd.Series([u1, u2, sim], index=['u1', 'u2', 'sim']) 

def main(): 
    with multiprocessing.Pool(processes=6) as pool: 
     vals = pool.map(processFun, pairGen()) 

    df2record = pd.DataFrame(columns=['u1', 'u2', 'sim']) 
    for v in vals: 
     if vals != None: 
      df2record = df2record.append(v, ignore_index=True) 
+0

ありがとうございました! 'TypeError:processFun()missing 1必要な位置引数: 'pair''出力を正しくマップするにはどうすればよいですか?ありがとう! – user5779223

+0

奇妙なことに、[this](https://gist.github.com/Marqin/292fd8b1cbbf5fbd24ba4a6935747b15)はPython 3.4.2と3.5.2で私のために働いています。どのバージョンのPythonを使用しますか? – Marqin

+0

私のバージョンはpython 3.5 – user5779223

0

まず第1に、このような小さなデータに対してマルチプロセッシングを使用することはお勧めしません。特にデータフレームで作業している場合は、データフレームにはさまざまな方法で役立つ独自のロット機能があるためです。あなたはちょうど適切なループを書く必要があります。

用途:multiprocessing.Pool

がちょうど(process_size = list_of_user)()をpool.mapするイテレータとして、ユーザのリストを渡します。ちょっと微調整してイテレータを作成するだけです。

from multiprocessing import Pool 
with Pool() as pool: 
    pool = multiprocessing.Pool(processes=6) 
    pool.map(function, iterator) 
関連する問題