5

半径 17 以上の 3D 構造要素を使用して、形状 (400,401,401)、サイズ 64320400 バイトの 3D 配列の形態的開口部を計算する必要があります。構造体要素 ndarray のサイズは 42875 バイトです。を使用するscipy.ndimage.morphology.binary_openingと、プロセス全体で 8 GB の RAM が消費されます。

私は GitHub で読んだことがありますscipy/ndimage/morphology.pyが、私が知る限り、モルフォロジー侵食演算子は純粋な C で実装されています。ni_morphology.cソースを理解するのは非常に難しいため、このコードのどの部分も見つけられませんでした。莫大なメモリ使用量。構造要素の半径に応じてメモリ使用量が指数関数的に増加する可能性があるため、RAM を追加することは有効な解決策ではありません。

問題を再現するには:

import numpy as np
from scipy import ndimage

arr_3D = np.ones((400,401,401),dtype="bool")

str_3D = ndimage.morphology.generate_binary_structure(3,1)
big_str_3D = ndimage.morphology.iterate_structure(str_3D,20)

arr_out_3D = ndimage.morphology.binary_opening(arr_3D, big_str_3D)

これには約 7GB の RAM が必要です。

上記の例で形態を計算する方法について誰か提案がありますか?

4

2 に答える 2

1

コードが何らかの方法で構造化要素を分解しようとしていて、いくつかの並列計算を実行しようとしているというのは、大げさな推測です。元のデータ全体の独自のコピーを使用した各計算。400x400x400はそれほど大きくありません...

私の知る限り、単一の開閉を行っているため、元のデータの最大 3 倍のメモリを使用する必要があります: 元 + 膨張/侵食 + 最終結果...

手動で実装してみてください...遅くなるかもしれませんが、コードは十分に簡単で、問題への洞察を与えるはずです...

于 2015-09-18T13:01:42.397 に答える