3

のような株式ティッカーを含むベクターがtickers = ['AAPL','XOM','GOOG']あり、「従来の」python プログラムでは、このtickersベクターをループし、 のようなティッカー文字列を 1 つ選択し、株式リターンAAPLを含む csv ファイルをインポートAAPLし、共通関数への入力としてリターンを使用します。最後に、csv ファイルを出力として生成します。4000 を超えるティッカーがあり、各ティッカーに適用する関数の処理に時間がかかります。mpi4pyジョブごとに約 100 個のプロセッサにアクセスできるパッケージを使用して、コンピューター クラスターにアクセスできます。私はPythonでこのmpi をよく理解しています(そして実装できました) :

from mpi4py import MPI

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
if rank == 0:
    data = [i for i in range(8)]
# dividing data into chunks
    chunks = [[] for _ in range(size)]
    for i, chunk in enumerate(data):
        chunks[i % size].append(chunk)
else:
    data = None
    chunks = None
data = comm.scatter(chunks, root=0)
print str(rank) + ': ' + str(data)

[cha@cluster] ~/utils> mpirun -np 3 ./mpi.py 
2: [2, 5]
0: [0, 3, 6]
1: [1, 4, 7]

したがって、この例では、サイズ 8 のデータ ベクトルがあり、各プロセッサ (合計 3 つ) に同じ数のデータ要素を割り当てます。上記の同様の例を使用して、各プロセッサに 1 つの株式ティッカーを割り当て、ティッカーごとに実行する必要がある関数を適用するにはどうすればよいですか? tickersプロセッサが解放されたら、ベクトルに戻っtickerてまだ処理されていないa を処理するように python に伝えるにはどうすればよいですか?

4

1 に答える 1

4

これには別の考え方もあります。4000 チャンクのデータを処理する 100 個のプロセッサがあります。これを見る 1 つの方法は、各プロセッサが処理対象のデータ ブロックを取得することです。均等に分割すると、各プロセッサは処理する 40 のティッカーを取得します。プロセッサ 1 は 0 ~ 39、プロセッサ 2 は 40 ~ 79 などになります。

このように考えると、プロセッサがタスクを終了したときに何が起こるかを心配する必要はありません。ループするだけです:

block_size = len(tickers) / size # this will be 40 in your example
for i in range(block_size):
    ticker = tickers[rank * block_size + i]
    process(ticker)

def process(ticker):
    # load data
    # process data
    # output data

これは理にかなっていますか?

[編集]
さらに詳しく知りたい場合、これは実際には、メモリの 1 つの次元に格納された多次元データにアクセスするための一般的な方法である、行優先のインデックス付けのバリエーションにすぎません。

于 2014-06-16T22:00:25.237 に答える