Python: 通过函数传递 memmap 数组?
Python: passing memmap array through function?
假设我正在使用非常大的数组(例如,~45GB)并试图通过一个 open 接受 numpy 数组的函数来传递它。最好的方法是:
- 为了有限的内存存储这个?
- 将这个存储的数组传递给一个只接受 numpy 数组的函数?
TLDR;试试吧...
我对隐马尔可夫模型一无所知,但对于 numpy mmap,您可能会发现它可以正常工作。我这样说是因为 np.memmap
是 ndarray
的直接子 class。也就是说,即使在 documentation 中,它也被声明为 "does not quite fit the ndarray subclass" 并建议可以使用 mmap.mmap(...)
自己创建 mmap 对象。 IMAO 在查看了 numpy.memmap.__new__()
函数之后,您无法做更多的事情来减少替换,在这种情况下,您必须查看要使用的函数,以及为什么要使用 mmap 数组打得不好。如果发生这种情况,更改这些文件甚至可能比更改应用 mmap 的方式更容易。
最后一点,当直接从磁盘(甚至缓冲)工作时,为一些缓慢的计算时间做好准备......我建议找到适当的源代码并在计算昂贵的分区的进度指示中进行黑客攻击。如果发生错误(或只是断电),增量写回还可以避免重新计算大数据分区。
这是我如何向 GaussianHMM().fit()
添加进度报告的示例:
添加内容以粗体显示
更改为 hmmlearn\base.py
:
class_BaseHMM(BaseEstimator):
# ...
def fit(self, X, lengths=None):
# ...
对于范围内的迭代器(self.n_iter):
统计数据 = self._initialize_sufficient_statistics()
curr_logprob = 0
<b>for i, j in iter_from_X_lengths(X, lengths, iter, self.n_iter)</b>: # 告诉我们的生成器哪次迭代
# ...
通过
更改为 hmmlearn\utils.py
<b>def iter_from_X_lengths(X, 长度, 迭代, 停止):</b>
如果长度为 None:
产量 0, len(X)
<b>打印("completion: 100%")</b>
别的:
<b>length = len(lengths)</b> #使用了每个循环所以我把它复制到一个本地变量
n_samples = X.shape[0]
结束 = np.cumsum(长度).astype(np.int32)
开始 = 结束 - 长度
如果结束[-1] > n_samples:
提高 ValueError("more than {0:d} samples in lengths array {1!s}"
.format(n_samples, 长度))
对于我在范围内(长度):
屈服开始[i],结束[i]
# 将循环迭代转换为完成百分比
<b>print("completion: {}%".format(int((float(iteration)/stop)+(float(i)/length/stop))*100))</b>
假设我正在使用非常大的数组(例如,~45GB)并试图通过一个 open 接受 numpy 数组的函数来传递它。最好的方法是:
- 为了有限的内存存储这个?
- 将这个存储的数组传递给一个只接受 numpy 数组的函数?
TLDR;试试吧...
我对隐马尔可夫模型一无所知,但对于 numpy mmap,您可能会发现它可以正常工作。我这样说是因为 np.memmap
是 ndarray
的直接子 class。也就是说,即使在 documentation 中,它也被声明为 "does not quite fit the ndarray subclass" 并建议可以使用 mmap.mmap(...)
自己创建 mmap 对象。 IMAO 在查看了 numpy.memmap.__new__()
函数之后,您无法做更多的事情来减少替换,在这种情况下,您必须查看要使用的函数,以及为什么要使用 mmap 数组打得不好。如果发生这种情况,更改这些文件甚至可能比更改应用 mmap 的方式更容易。
最后一点,当直接从磁盘(甚至缓冲)工作时,为一些缓慢的计算时间做好准备......我建议找到适当的源代码并在计算昂贵的分区的进度指示中进行黑客攻击。如果发生错误(或只是断电),增量写回还可以避免重新计算大数据分区。
这是我如何向 GaussianHMM().fit()
添加进度报告的示例:
添加内容以粗体显示
更改为 hmmlearn\base.py
:
class_BaseHMM(BaseEstimator):
# ...
def fit(self, X, lengths=None):
# ...
对于范围内的迭代器(self.n_iter):
统计数据 = self._initialize_sufficient_statistics()
curr_logprob = 0
<b>for i, j in iter_from_X_lengths(X, lengths, iter, self.n_iter)</b>: # 告诉我们的生成器哪次迭代
# ...
通过
更改为 hmmlearn\utils.py
<b>def iter_from_X_lengths(X, 长度, 迭代, 停止):</b>
如果长度为 None:
产量 0, len(X)
<b>打印("completion: 100%")</b>
别的:
<b>length = len(lengths)</b> #使用了每个循环所以我把它复制到一个本地变量
n_samples = X.shape[0]
结束 = np.cumsum(长度).astype(np.int32)
开始 = 结束 - 长度
如果结束[-1] > n_samples:
提高 ValueError("more than {0:d} samples in lengths array {1!s}"
.format(n_samples, 长度))
对于我在范围内(长度):
屈服开始[i],结束[i]
# 将循环迭代转换为完成百分比
<b>print("completion: {}%".format(int((float(iteration)/stop)+(float(i)/length/stop))*100))</b>