2016-08-02 10 views
0

私はPythonでマルチプロセッシングコーディングをするのに数時間を費やしました。 documentのコードを読んだ後、私は以下のコードを書いた。私の計画は、2つのグローバルデータフレームに値を一緒に追加し、その結果を辞書に割り当てることです。辞書とデータフレームでマルチプロセッシングのPythonコードを書く方法

from multiprocessing import Process, Manager 
import pandas as pd 
import numpy as np 
import time 

def f(d): 
    for i in C: 
     d[i] = A.loc[i].sum() + B.loc[i].sum() 

C = [10,20,30] 
A = pd.DataFrame(np.matrix('1,2;3,4;5,6'), index = C, columns = ['A','B']) 
B = pd.DataFrame(np.matrix('3,4;5,4;5,2'), index = C, columns = ['A','B']) 

if __name__ == '__main__': 
    manager = Manager() 
    d = manager.dict() 
    d = dict([(c, 0) for c in C]) 
    t0 = time.clock() 
    p = Process(target=f, args=(d,)) 
    p.start() 
    p.join() 
    print time.clock()-t0, 'seconds processing time' 
    print d 

d = dict([(c, 0) for c in C]) 
t0 = time.clock() 
f(d) 
print time.clock()-t0, 'seconds processing time' 
print d 

ない以下に示す私のLinuxサーバ、の結果が私の期待:

0.0秒の処理時間

{10:0、20:0、30:0}

0.0秒の処理時間

{10:10,20:16、30:18}

マルチプロセッシングの部分は2つのデータフレームの値を追加しませんでしたようです。あなたは私にいくつかのヒントを教えてもらえますか?

ありがとうございます。

+0

'Process'重複メモリ、dは異なるでしょう。その間、 –

+0

の 'threading.Thread'を試してください。私はその文書をチェックしました。あなたはほとんど正しいです。私の答えを確認してください –

答えて

0

あなたが適応し、働くことができることをここで例:

https://docs.python.org/2/library/multiprocessing.html

あなたはプロセス間でメモリを共有できるようにマネージャーオブジェクトを使用しています。

manager = Manager() 
d = manager.dict() # correct 
d = dict([(c, 0) for c in C]) # d is not a manager.dict: no shared memory 

後、あなたがマネージャーを使用して辞書を作成していますが、通常の辞書でラインをそれを殺すあなたの例では

は、代わりにこれを行う(テストし、コンパイル)

d = manager.dict([(c, 0) for c in C]) 
+0

正しい方法は 'd = manager.dict([Cのcの場合は(c、0)])'です。 – Wedoso

+0

私はそれを後で追加しました。 –