2017-12-28 20 views
1

私は18Gbのpickleファイルを持っていますが、これはプロセス間でアクセスする必要があります。私はどのように大規模な読み取り専用辞書を共有する/マルチプロセスのプロセス全体のリストをPythonで?

from multiprocessing import Manager 
import cPickle as pkl 
manager = Manager() 
data = manager.dict(pkl.load(open("xyz.pkl","rb"))) 

を使用してみましたが、私は次の問題を取得しています:

IOError: [Errno 11] Resource temporarily unavailable 

誰かがそれが原因でソケットタイムアウトのかもしれない示唆したが、タイムアウトを増やすと、それはそれのようには思えない助けにはなりませんでした。 これについてどうすればいいですか?プロセス間でデータを共有する他の効率的な方法はありますか?

+1

'cPickle'?あなたはPython 2を使用していますか?多分あなたはpython 3で試してみることができます。 –

+0

私はmanager.dictなしでpickleファイルを読み込めます。だから、それが問題なのかどうかは疑問だ –

答えて

1

これはほとんどがShared memory in multiprocessingの複製ですが、単純な配列や値ではなく、dictまたはlistオブジェクトが特にあります。

残念ながら、辞書の内部は複雑で(異なるPythonバージョンでは異なるため)、辞書やリストを共有する方法はありません。 Arrayオブジェクトを使用できるように問題を再構成できる場合は、shared Arrayを作成して一度だけ入力し、ロックなしで使用できます。これは、多くのが一般的により効率的になります。

アクセスパターンによっては、まずオブジェクトをロードしてからプロセスプールを作成することもできますが、コピーオンライトのforkのUnixライクなシステムではうまく動作します。しかし、ここには保証はありません。

エラー番号11 = EAGAIN = "リソースは一時的に利用できません"というエラーは、Managerインスタンスを通じて膨大な値のセットを送信しようとしたときに発生します。管理者はを共有しません基になるデータ:代わりに、プロキシはにアクセスし、それぞれの独立したプロセスが独自のコピーを持ち、1つのプロセスが値を更新すると、共有する。このようにして、誰もが(最終的にアクセスタイミングに応じて)値が何であるかについて同意することができるので、すべてと同じ値を使用するように見えます()。実際には、それぞれにプライベートコピーがあります。

関連する問題