4

h5pyを使用して HDF5 ファイルとしてディスクに保存するかなり大きな 4D 配列 [20x20x40x15000] があります。今問題は、配列全体の平均を計算したいということです。つまり、次を使用します。

numpy.average(HDF5_file)

を取得しMemoryErrorます。numpy が HDF5 ファイルをメモリにロードして平均を実行しようとしているようです。

誰かがこの問題に対するエレガントで効率的な解決策を持っていますか?

4

1 に答える 1

8

240 000 000 の値を折りたたむには、数行のコードが効果的に機能する必要があります。Numpy はすべてのデータをメモリにロードすることで機能するため、発見したデータを素朴にロードすることはできません。問題をチャンクに分割し、map/reduce アプローチを使用する必要があります。

  • チャンク サイズを選択します (メモリの制約に従って)
  • データをこのサイズのチャンクに分割します (複数のファイルを作成するか、一度に 1 つのチャンクのみをロードします)。
  • 各チャンクについて、平均を計算し、データをアンロードします
  • 平均を最終結果にマージします。

from_bufferを count および offset 引数とともに使用して、データの一部をロードできます。

編集

Python プロファイラーを使用して、相対コストを確認できます。

主なコストが処理である場合は、マルチプロセス ライブラリのプロセス プールまたは numpy の並列バージョンを使用して並列化を試みることができます。または、pyopencl などの GPGPU ライブラリを使用します。

処理時間が読み込み時間と同等である場合は、マルチプロセッシング ライブラリを使用して 2 つのタスクをパイプライン処理することができます。データをロードして処理スレッドにフィードするスレッドを 1 つ作成します。

主なコストが読み込み時間である場合は、より大きな問題があります。異なるコンピューターでタスクを分割することを試みることができます (グリッド ライブラリを使用してデータの複製とタスクの分散を管理します)。

于 2012-09-04T13:36:28.043 に答える