我在(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)
有没有更快的方法可以做到这一点而不破坏内存限制?
答案 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]])