改组大型内存映射的numpy数组

时间:2019-09-25 11:39:21

标签: python arrays numpy random numpy-memmap

我在(20000000, 247)文件中有一个尺寸为30 GB的数组,大小约为.npy。我有32 GB可用内存。我需要将数据沿行进行混洗。我已经在mmap_mode中打开了文件。但是,如果我尝试就地修改以外的任何方法,例如np.random.permutation或创建索引p的random.sampled数组,然后返回array[p],则会收到MemoryError。我还尝试过对in块进行改组,然后尝试堆叠这些块以构建完整的数组,但是MemoryError。到目前为止,我发现的唯一解决方案是将文件加载到mmap_mode = 'r+'中,然后执行np.random.shuffle。但是,这需要永远的时间(已经5个小时了,它仍在不断改组)。

当前代码:

import numpy as np
array = np.load('data.npy',mmap_mode='r+')
np.random.seed(1)
np.random.shuffle(array)

有没有更快的方法可以做到这一点而不破坏内存限制?

1 个答案:

答案 0 :(得分:0)

也许不是最好的解决方案,但这是我所依赖的。 获取索引数组,然后对其进行混洗,并使用它来获取经过改组的mem映射的numpy数组。我认为这比等待5个小时更好;)

import numpy as np
array = np.load('data.npy',mmap_mode='r')
rows = array.shape[0]
indices = np.arange(rows)
np.random.seed(1)
np.random.shuffle(indices)

for i in range(rows):
    print(array[indices[i]])