Python 3.3 を使用してコードを実行しています。目標は、data_3d (1000x1000x1000 Boolean ndarray) を kernel (35x35x35 float ndarray) に関連付けることです。
次に、別の相関を実行して、前の結果を合計します。そのため、別の 1000x1000x1000 Boolean ndarray を 35x35x35 float ndarray と関連付けています。これは前の手順とまったく同じです。
ここで私は混乱します。最初の相関は 70 秒で完了します。2番目の(一見同一の)プロセスは完了しません(つまり、1時間以上待機しました...)。
2 番目の相関 (たとえば、5x5x5 配列との相関) のサイズを縮小しようとしましたが、同じ結果が得られました。
おそらく、これはメモリの問題ではありません。2 番目のプロセスでは、メモリが 18 GB でプラトーになります (ただし、まだ 14 GB を使用できます...)。
どうしたの?
これが私のコードです:
import numpy as np
from scipy import ndimage as im
パート A:
t1 = time.time()
# Used to time the process`
# a is a np.ndarray of dtype = bool
a = im.correlate(data_3d, kernel) > threshold
t2 = time.time()
print(t2 - t1) # About 70 seconds
パート B: この次のパートは決して完成しません!
b = im.correlate(a, np.ones((35, 35, 35)))
t3 = time()`
編集:解決策を見つけました。パート A のカーネルは非常にまばらですが、パート B のカーネルは完全に読み込まれています。Scipy には、スパース行列のフィルター サイズを変更するための裏技が必要です。これにより、A = O(N^3) および B = O(N^3 * n^3) の時間が複雑になります。 N = 画像の 1D サイズおよび n = カーネルの 1D サイズ。