半径 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 が必要です。
上記の例で形態を計算する方法について誰か提案がありますか?