随机读取 .h5 文件中的元素而不加载整个矩阵

Posted

技术标签:

【中文标题】随机读取 .h5 文件中的元素而不加载整个矩阵【英文标题】:Read randomly elements in .h5 file without loading whole matrix 【发布时间】:2019-03-11 18:58:57 【问题描述】:

我有一个无法放入 RAM 的庞大训练数据集。我试图在堆栈中加载随机批次的图像而不加载整个.h5。我的方法是创建一个索引列表并将它们打乱,而不是打乱整个 .h5 文件。 比方说:

a = np.arange(2000*2000*2000).reshape(2000, 2000, 2000)
idx = np.random.randint(2000, size = 800) #so that I only need to shuffle this idx at the end of epoch

# create this huge data 32GBs > my RAM
with h5py.File('./tmp.h5', 'w') as f:
     tmp = f.create_dataset('a', (2000, 2000, 2000))
     tmp[:] = a

# read it
with h5py.File('./tmp.h5', 'r') as f:
     tensor = f['a'][:][idx] #if I don't do [:] there will be error if I do so it will load whole file which I don't want

有人有解决办法吗?

【问题讨论】:

错误是什么?你读过docs.h5py.org/en/stable/high/dataset.html#fancy-indexing吗? 使用[:] 加载数组,允许您在生成的numpy 数组上使用[idx] 1) 索引必须是唯一的并且严格递增。你可以使用 tensor = dset['a'][:,idx,:] 加载部分 dset 【参考方案1】:

感谢@max9111,这是我建议的解决方法:

batch_size = 100 
idx = np.arange(2000)
# shuffle
idx = np.random.shuffle(idx)

由于constraint of h5py:

选择坐标必须按递增顺序给出

阅读前应该先排序:

for step in range(epoch_len // batch_size):
     try:
          with h5py.File(path, 'r') as f:
               return f['img'][np.sort(idx[step * batch_size])], f['label'][np.sort(idx[step * batch_size])]
     except:
          raise('epoch finished and drop the remainder')

【讨论】:

以上是关于随机读取 .h5 文件中的元素而不加载整个矩阵的主要内容,如果未能解决你的问题,请参考以下文章

h5py读取时间在读取速度上有随机且剧烈的波动

Web,SQL:尽管文件名显示随机图像,从文件夹加载图像

R 中的 hdf5 文件,用于通过 ID 进行快速随机访问

如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]

(C) 获取矩阵中一行最小的 3 个元素,并随机选择一个

c语言编写程序,对5x5矩阵的下半三角形各元素中的值乘以2,要求数组a的每行每列元素值由随机函数