【发布时间】:2019-09-24 04:07:14
【问题描述】:
我正在根据数字 0、1 和 2 生成一个非常大的排列矩阵。理想情况下,我希望它们 48 宽,但甚至对 20 感到满意。现在,我的内存用完了,所以想看看有没有是一个非基于内存的选项可用。
我确实在大型内存机器上尝试过,但我更喜欢使用磁盘的选项(我有一个快速的 SSD),即使它需要很长时间。如您所见,我已经将其设置为 int8 而不是 int32 以节省一些空间,但即便如此也仅此而已。 18 的 Grid_size 是 6.5G,而 19 是 21G,所以我知道它呈指数增长,我很快就会成为 TB。
import numpy as np
class LargeGrid():
def permgrid(self, m, n):
inds = np.indices((m,) * n, dtype=np.int8)
arr = inds.reshape(n, -1).T
arr[arr == 2] = -1
return arr
def save(self):
grid_size = 24
grid = self.permgrid(3,grid_size)
np.save('grid', grid)
lg = LargeGrid()
lg.save()
预计磁盘上有一个非常大的文件,但结果是:
Python 3.7.3 (default, Apr 24 2019, 15:29:51) [MSC v.1915 64 bit (AMD64)] on win32
MemoryError: Unable to allocate array with shape (24, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3) and data type int8
【问题讨论】:
-
numpy最多允许 32 个维度。 -
当您询问此类错误时,提供回溯是有礼貌的。我继续测试了您的部分代码,并在
np.indices中得到了错误,它尝试在res = np.empty(24,followed by 24 3's)中。它必须在某个地方所有这些索引。 -
使用
sparse=True,np.indices将返回一个包含 24 个数组的元组,每个数组包含 3 个元素和ndim=24。 -
你可以试试
for i in itertools.product([0,1,3], repeat=24): <do your thing one permuation at a time>。 -
@hpaulj - 这是一个很好的建议,并给了我重构的想法 - 我的方法并不理想,使用如此大的矩阵将无法扩展。