地理空間データを取得していくつかのステップを実行するアルゴリズムを作成しました。入力データは、大規模なラスター調査エリア (~1 億 5000 万ピクセル) のポリゴンと共変量ラスターのシェープファイルです。手順は次のとおりです。
- シェープファイルのポリゴン内からのサンプル ポイント
- サンプリング ポイントごとに、共変量ラスターから値を抽出します。
- サンプリング ポイントで予測モデルを構築する
- ターゲット グリッド ポイントの共変量を抽出する
- 予測モデルをターゲット グリッドに適用する
- 一連の出力グリッドに予測を書き込む
プロセス全体を数回 (たとえば 100 回) 反復する必要がありますが、現在、連続して処理すると、各反復に 1 時間以上かかります。各反復で最も時間がかかるのはステップ 4 と 5 です。ターゲット グリッドが非常に大きいため、一度に 1 ブロック (たとえば 1000 行) ずつ処理しています。
私は 32 Gb の RAM を備えた 6 コアの CPU を使用しているため、各反復内でオブジェクトを含む Python のmultiprocessing
モジュールを使用しPool
て、多数のブロックを同時に処理し (ステップ 4 と 5)、出力 (予測) を書き込んでみました。グローバル出力書き込み関数を呼び出すコールバック関数を使用して、出力グリッドの共通セットに。これは機能しているように見えますが、各ブロックを連続して処理するよりも高速ではありません (実際には、おそらく低速です)。
だから私の質問は、それを行うためのより効率的な方法はありますか? multiprocessing モジュールのQueue
クラスに興味がありますが、どのように機能するのかよくわかりません。たとえば、ステップ 4 と 5 を実行するキューを作成してから、ステップ 6 を実行する別のキューに結果を渡す方が効率的かどうか疑問に思っています。
任意のポインタをいただければ幸いです。