【发布时间】:2020-01-25 14:16:15
【问题描述】:
我在.npy 文件中有一个尺寸为(20000000, 247) 的数组,大小约为30 GB。我有32 GB 可用内存。我需要沿行对数据进行洗牌。我在mmap_mode 中打开了文件。但是,如果我尝试就地修改以外的任何操作,例如 np.random.permutation 或创建一个随机采样数组索引 p 然后返回 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 GB?通过这种方式,您可以对每个分片内的数据进行混洗,并在最后对分片进行混洗。如果需要,您可以将打乱的分片合并到一个大文件中。
-
@carobnodrvo 我知道,实际上这是用于训练神经网络。我有一个实际的工作代码,我可以在其中读取块中的数据,打乱每个块并将其提供给网络。但是,现在我有这个特殊的约束,我需要在同一个文件中的所有洗牌数据。单独洗牌然后追加是行不通的。
-
合并的事情导致
MemoryError我不确定它是否是预期的。 -
哦,我明白了,这是因为您没有足够的内存来容纳整个数组 + 一个块。
-
MemoryError,假设我已将 30 个文件中的 25 个左右 1 GB 文件合并为 1 个。然后,当我在 mmap_mode 中加载该文件并尝试附加另一个 1 GB 文件时,内存不足。
标签: python arrays numpy random numpy-memmap