3

假设我正在使用非常大的数组(例如,~45GB)并试图通过一个 open 接受 numpy 数组的函数来传递它。最好的方法是:

  1. 将其存储为有限的内存?
  2. 将此存储的数组传递给只接受 numpy 数组的函数?
4

1 回答 1

1

TLDR;就试一试吧...

我对隐藏的马尔可夫模型一无所知,但至于 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))
于 2016-10-27T19:16:16.047 回答