データセット全体をRAMにnumpy配列で読み込み、LinuxまたはMacで作業していると仮定しています。 (もしあなたがWindowsの場合、または配列をRAMに収めることができない場合は、おそらくディスク上のファイルに配列をコピーしてnumpy.memmapを使ってアクセスする必要があります。コンピュータはディスクからRAMにデータをキャッシュしますこれらのキャッシュはプロセス間で共有されるため、恐ろしい解決策ではありません)。で作成された他のプロセスのデータセットへの読み取り専用アクセスが必要な場合は、上記の前提条件を使用して、他のプロセスを起動します。彼らは元の名前空間からのデータへの読み取り専用アクセス権を持ちます。それらは元の名前空間からデータを変更できますが、それらの変更は他のプロセスからは見えません(メモリマネージャは変更したメモリの各セグメントをローカルメモリマップにコピーします)。
あなたの他のプロセスが元のデータセットを変更し、親プロセスまたは他のプロセスに見えるそれらの変更を加える必要がある場合は、このような使用することができます
import multiprocessing
import numpy as np
# create your big dataset
big_data = np.zeros((3, 3))
# create a shared-memory wrapper for big_data's underlying data
# (it doesn't matter what datatype we use, and 'c' is easiest)
# I think if lock=True, you get a serialized object, which you don't want.
# Note: you will need to setup your own method to synchronize access to big_data.
buf = multiprocessing.Array('c', big_data.data, lock=False)
# at this point, buf and big_data.data point to the same block of memory,
# (try looking at id(buf[0]) and id(big_data.data[0])) but for some reason
# changes aren't propagated between them unless you do the following:
big_data.data = buf
# now you can update big_data from any process:
def add_one_direct():
big_data[:] = big_data + 1
def add_one(a):
# People say this won't work, since Process() will pickle the argument.
# But in my experience Process() seems to pass the argument via shared
# memory, so it works OK.
a[:] = a+1
print "starting value:"
print big_data
p = multiprocessing.Process(target=add_one_direct)
p.start()
p.join()
print "after add_one_direct():"
print big_data
p = multiprocessing.Process(target=add_one, args=(big_data,))
p.start()
p.join()
print "after add_one():"
print big_data
を