私は、64ビットのPython 3.3.0はCPythonインタプリタを使用して、64ビットのLinux(カーネル バージョン2.6.28.4)マシン上で実行されている(生物学)カスタムシミュレータを持っています。パイプを使用してプロセス間でPythonオブジェクトを転送する際のバイト制限はありますか?
シミュレータは、私は実験を実行するために並列処理に建て 、有効な結果を得るために多くの独立した実験に依存するため。 スレッド間の通信は、主に管理 multiprocessing Queue
S(doc)と生産者 - 消費者パターンの下で発生します。次のように アーキテクチャのランダウンは:
- 産卵及び管理
Process
ESおよびシミュレーションを消費 - 1の結果、消費者の処理を行う様々な
Queue
S - Nワーカープロセスを処理するマスター・プロセスシミュレーション結果と結果のソートと分析
マスタプロセスとワーカープロセスは、入力Queue
で通信します。 同様に、ワーカープロセスは結果を出力Queue
に配置します。これは、結果コンシューマプロセスがアイテムを消費する です。最終ResultConsumer オブジェクトは、バックマスタープロセスにmultiprocessing Pipe
(doc) を介して渡されます。
すべてが、それはPipe
を経由して戻って にマスタープロセスをResultConsumerオブジェクトを渡すしようとするまで正常に動作します:私は最初の2つのトレース(Process
、ライブラリ内の未処理終了)、 を理解
Traceback (most recent call last):
File "/home/cmccorma/.local/lib/python3.3/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/home/cmccorma/.local/lib/python3.3/multiprocessing/process.py", line 95, in run
self._target(*self._args, **self._kwargs)
File "DomainArchitectureGenerator.py", line 93, in ResultsConsumerHandler
pipeConn.send(resCon)
File "/home/cmccorma/.local/lib/python3.3/multiprocessing/connection.py", line 207, in send
self._send_bytes(buf.getbuffer())
File "/home/cmccorma/.local/lib/python3.3/multiprocessing/connection.py", line 394, in _send_bytes
self._send(struct.pack("!i", n))
struct.error: 'i' format requires -2147483648 <= number <= 2147483647
と3番目はResultConsumerオブジェクトを Pipe
までマスタプロセスに送信するためのコードです。最後の2つのトレースは、 が興味深いところです。 Pipe
ピクルスそれに送信され、他端に 得られたバイトがrecv()
実行時 アンピクルある(マッチング接続)を通過する任意のオブジェクト。 self._send_bytes(buf.getbuffer())
は、 にピクルされたオブジェクトのバイトを送信しようとしています。 self._send(struct.pack("!i", n))
は で、長さnの整数(ネットワーク/ビッグエンディアン)で構造体をパックしようとします。 ここで、nはパラメータとして渡されるバッファの長さです(struct
ライブラリはPython値とC構造体 Python文字列として、the docを参照してください)。
このエラーは、多くの実験を試みる場合にのみ発生します。 10回の実験 はそれを引き起こすことはありませんが、1000は常に有効です(他のすべてのパラメータは定数です)。これまでstruct.error
がスローされる理由の私の最高 仮説がパイプを押し下げることしようとしたバイト の数は2^32-1(2147483647)、または〜2ギガバイトを超えていることです。
だから私の質問は二つある:
私は
_struct
からstruct.py
基本的にちょうど 輸入としての私の調査で立ち往生していると私はそれがある見当がつかない。基本的なアーキテクチャがすべて 64ビットであると仮定すると、バイト制限は任意であるように見えます。だから、なぜ私はそれ以上のものを渡すことができないのですか?さらに、私が がこれを変更できない場合は、この問題の良い(読んだ:簡単な)回避策がありますか?
注:私はQueue
年代は、同様の酸洗中間ステップを使用している疑いがあるとしてPipe
の代わりにQueue
を使用すると、問題、 を解決するとは思いません。 編集:このメモは、abarnertの回答で指摘されているとおり、完全に間違っています。
あなたが本当にばかばかしい回避策を望むなら、あなたは 'process.py'を開いてその行を長いものに変更することができますが、どこにでも行かなければならないでしょう。 。 –
@SuperDisk: 'process.py'に関連する行はありません。長いものに変更するintはありません(Python 3.xではlong型でなく、2.7でも同じ型です) 。また、 'multiprocessing'をmonkeypatchするか、それをforkして別のコピーを保持し、stdlibを適切に修正する方がはるかに優れています。 – abarnert
@abarnertトレースバックから349行目のように見えます。 'i'を 'q'に変更します(これはstructモジュールにとっては長いです)。おそらく私は間違っていますか? –