假设我正在使用非常大的数组(例如,~45GB)并试图通过一个 open 接受 numpy 数组的函数来传递它。最好的方法是:
- 将其存储为有限的内存?
- 将此存储的数组传递给只接受 numpy 数组的函数?
假设我正在使用非常大的数组(例如,~45GB)并试图通过一个 open 接受 numpy 数组的函数来传递它。最好的方法是:
我对隐藏的马尔可夫模型一无所知,但至于 numpy mmap,您可能会发现它可以正常工作。我这样说np.memmap
是因为它是ndarray
. 也就是说,即使在文档中,它也声明它“不太适合 ndarray 子类”并建议可以自己创建 mmap 对象mmap.mmap(...)
。IMAO 在查看了该numpy.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))