【问题标题】:Shuffling large memory-mapped numpy array改组大型内存映射的numpy数组
【发布时间】: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


【解决方案1】:

也许不是最好的解决方案,但这是我所依赖的。 获取索引数组,然后对其进行洗牌并使用它来获取洗牌的 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]])

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 2016-06-30
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2020-01-31
    • 2014-08-16
    • 2018-08-27
    • 2011-04-28
    相关资源
    最近更新 更多