非常に大きな配列 (例: ~45GB) を扱っていて、それを numpy 配列を受け入れる関数に渡そうとしているとします。最善の方法は次のとおりです。
- これを限られたメモリ用に保存しますか?
- この格納された配列を、numpy 配列のみを受け取る関数に渡しますか?
非常に大きな配列 (例: ~45GB) を扱っていて、それを numpy 配列を受け入れる関数に渡そうとしているとします。最善の方法は次のとおりです。
隠れマルコフ モデルについては何も知りませんが、numpy mmap については、うまくいくと思うかもしれません。np.memmap
の直接のサブクラスであるため、これを言いますndarray
。とはいえ、ドキュメントでも、「ndarray サブクラスにはまったく適合しない」と述べられており、.mmap オブジェクトを自分で作成することが可能であることが示唆されていますmmap.mmap(...)
。IMAOnumpy.memmap.__new__()
関数を調べた後、それをドロップイン置換にするためにできることはこれ以上ありません。その場合、使用したい関数と、mmap配列がうまく機能しない理由を調べる必要があります. その場合、mmap の適用方法を変更するよりも、これらのファイルを変更する方が簡単な場合があります。
最後に、ディスクから直接作業する場合 (バッファリングされている場合でも)、計算時間が遅くなることに備えてください...適切なソースコードを見つけて、計算コストの高いパーティションへの進行状況を示すハッキングをお勧めします。また、インクリメンタル ライトバックにより、エラー (または単なる停電) が発生した場合に、データの大きなパーティションを再計算する必要がなくなります。
に進捗レポートを追加する方法の例を次に示しますGaussianHMM().fit()
。
追加は太字
に変更hmmlearn\base.py
:
class _BaseHMM(BaseEstimator):
# ...
def fit(self, X, lengths=None):
# ...
for iter in range(self.n_iter):
stats = self._initialize_sufficient_statistics()
curr_logprob = 0
for i, j in iter_from_X_lengths(X, lengths, iter, self.n_iter): # tell our generator which iteration
# ...
pass
に変更hmmlearn\utils.py
def iter_from_X_lengths(X, lengths, iteration, stop):
if lengths is None:
yield 0, len(X)
print("completion: 100%")
else:
length = len(lengths) #used every loop so I copied it to a local var
n_samples = X.shape[0]
end = np.cumsum(lengths).astype(np.int32)
start = end - lengths
if end[-1] > n_samples:
raise ValueError("more than {0:d} samples in lengths array {1!s}"
.format(n_samples, lengths))
for i in range(length):
yield start[i], end[i]
# convert loop iterations to % completion
print("completion: {}%".format(int((float(iteration)/stop)+(float(i)/length/stop))*100))