5

Python スクリプトを使用して、4D 画像 (機能的 MRI スキャン) から情報を操作および抽出しています。分析の一部は、マルチプロセッシング パッケージを使用して (被験者ごとに) 並行して実行するように設定されています。

pool = Pool(processes=numberCores)
resultList = pool.map(SubjectProcesser, argList) # where arglist is the list of arguments passed to the process

これらは、さまざまな種類のファイルとさまざまな種類の分析に適用されます。特定のタイプの分析で、次のエラーが発生します。

Process PoolWorker-1:
Traceback (most recent call last):
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
  self.run()
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/process.py", line 114, in run
  self._target(*self._args, **self._kwargs)
File "/home2/surchs/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 99, in worker
  put((job, i, result))
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/queues.py", line 392, in put
  return send(obj)
IOError: bad message length

失敗するところまで絞り込みました。並列プロセスは明らかに正常に実行されます (スクリプトのさまざまな段階でさまざまなデバッグ出力を見て判断します) が、結果の再マッピング中にエラーが発生します。

このエラー メッセージを検索しましたが、まだ解決策が見つかりません。私のスクリプトは他のすべてのタイプの分析で機能するため、何が起こっているのか疑問に思っています。

これが問題に関与していると思うので、分析について少し

さまざまな分析は、多かれ少なかれ脳内のボクセルの時系列抽出です (4 番目の次元として時間を含む 3D マトリックスとしての脳を想像してください。マトリックス要素はボクセルと呼ばれます)。脳内の任意のポイントには、すべての時点で活性化値があります。時系列は、時間の経過に伴う特定のボクセルのすべてのアクティベーション値のベクトルです。

次に、すべてのボクセル間の相関係数を計算し (ボクセルごとの次元の正方相関行列が得られます)、すべての相関係数のベクトル (行列の下三角) を並列処理の出力として返します。

エラーをスローしないすべての分析について、(地域ノードに基づいて) 複数のボクセルを平均化し、この地域の平均時系列を使用して、2 つのことを効果的に実行しています。

  1. ボクセルの数を (領域の数まで) 大幅に削減
  2. 常にゼロであるボクセルを取り除きます (平均化の結果として。ゼロのボクセルのみを含む領域はありません)。

対照的に、上記のエラーを与える分析は、脳内のすべてのボクセル時系列を使用するため、はるかに大きな相関行列が得られます。

すべての被験者ファイルをマスクしてゼロボクセルを取り除こうとしましたが、「ゼロ除算」エラーも発生していませんが、考えられるのはこれらの2つだけです。

また、前述のように、処理の並列部分は問題なく実行されます。おそらく結果の再マッピング中に、実行後にエラーがスローされます。

どんな助けでも大歓迎です。また、追加の詳細を提供する必要がある場合は、お知らせください。

4

1 に答える 1

2

子プロセスから返すオブジェクトが大きくなりすぎると(私の場合は数十ギガバイト)、同じ問題が発生します。これらの巨大なオブジェクトをピクルスにして、プロセス通信を介して親プロセスに送り返す必要があり、それが問題の原因である可能性があります。もちろん、このエラーが発生していなくても、数十ギガバイトのデータを移動することはお勧めできません。したがって、私の解決策は、プログラムの構造を変更して、そのような大きなオブジェクトを渡す必要をなくすことでした。

できるかもしれないことの1つは、共有メモリを使用することです。私のオブジェクトは非常に複雑で、コードを大幅に変更せずに共有メモリに作成するのは簡単ではないため、これはあまりうまくいきませんでしたが、管理しやすいかもしれません。

この他のスレッドも参照してください:Pythonマルチプロセッシングの共有メモリオブジェクト

于 2012-12-07T21:14:00.443 に答える