2011-12-15 9 views
5

私は、コピーを含まない方法で多くのPythonプロセス間で共有したいnumpy配列を持っています。私はsharedmemパッケージを使用して既存のnumpy配列から共有numpy配列を作成します。共有非連続アクセスナンシー配列

import sharedmem as shm 
def convert_to_shared_array(A): 
    shared_array = shm.shared_empty(A.shape, A.dtype, order="C") 
    shared_array[...] = A 
    return shared_array 

私の問題は、各サブプロセスが配列内でランダムに分布している行にアクセスする必要があるということです。現在、私はsharedmemパッケージを使って共有numpy配列を作成し、それを各サブプロセスに渡します。各プロセスには、アクセスする必要がある行のリストidxもあります。

#idx = list of randomly distributed integers 

local_array = shared_array[idx,:] 

# Do stuff with local array 

これは別のビューの代わりに配列のコピーを作成します。アレイは非常に大きく、各プロセスが

local_array = shared_array[start:stop,:] 

ような行の連続した範囲にアクセスするようにshareing前に、最初にそれを操作することは時間がかかりすぎます。

質問:配列をコピーすることを含まないPythonプロセス間でnumpy配列へのランダムアクセスを共有する良い解決策はありますか?

サブプロセスには読み取り専用アクセスが必要です(アクセス時にロックする必要はありません)。

+1

これは価値がありますが、これは共有メモリとは何の関係もありません。ナンシーアレイはメモリ内で連続していなければならないので、任意の手の込んだインデックス付け(例えば、インデックス配列によるインデックス付け)は常にコピーを返す。これは、何の配列もない場合に当てはまります。より小さな塊の標本で作業するか、スライスするのではなく反復する。 –

+0

@JoeKington - あなたはそうです。問題は一般的には、配列の数が少ないことです。 –

答えて

1

ファンシーインデックスはコピーを誘導するので、コピーを回避したい場合にはインデックス作成を避ける必要があります。

関連する問題