Numpy 与不可调整大小的hdf5相比,加载长度可调整的hdf5非常慢

Numpy 与不可调整大小的hdf5相比,加载长度可调整的hdf5非常慢,numpy,hdf5,Numpy,Hdf5,我有一个原始的hdf5文件,其中有一个数据集,它的形状是(37372242243),不可扩展。i、 e.在创建过程中未传递maxshape参数 我决定创建一个新的hdf5文件,并使用maxshape=(None,224,224,3)创建数据集,以便稍后调整其大小。然后,我将数据集从原始hdf5复制到新的hdf5,并保存 两个hdf5的内容完全相同。然后我尝试读取所有数据,发现可调整大小的版本的性能显著下降 原件: CPU时间:用户660毫秒,系统:2.58秒,总计:3.24秒 壁时间:6.08秒

我有一个原始的hdf5文件,其中有一个数据集,它的形状是(37372242243),不可扩展。i、 e.在创建过程中未传递maxshape参数

我决定创建一个新的hdf5文件,并使用maxshape=(None,224,224,3)创建数据集,以便稍后调整其大小。然后,我将数据集从原始hdf5复制到新的hdf5,并保存

两个hdf5的内容完全相同。然后我尝试读取所有数据,发现可调整大小的版本的性能显著下降

原件: CPU时间:用户660毫秒,系统:2.58秒,总计:3.24秒 壁时间:6.08秒

可调整大小: CPU时间:用户18.6秒,系统4.41秒,总计23秒 壁时间:49.5秒


这几乎是速度的10倍。这是意料之中的事吗?文件大小差异仅小于2MB。是否有优化提示/技巧需要我注意?

仔细阅读hdf5文档后,如果在创建数据集期间指定maxshape(这使其能够在将来调整大小),似乎也会打开分块。这似乎是强制性的。它默认给我的“默认”分块大小是dataset.chunks=(234,14,28,1)

根据doc的说法,这意味着数据不是连续的,而是“随意”存储在类似b树的结构中。这很可能解释了我观察到的缓慢,它可能比我想象的做了更多的额外I/o

我通过传递“chunks=(3737372242243)”将chunk size设置为整个数据集的大小,这一次,我得到了

CPU时间:用户809微秒,系统:837毫秒,总计:838毫秒 墙壁时间:914毫秒


这大大加快了我的(37372242243)张量的加载速度。我有点理解为什么分块是一种可伸缩性解决方案。但它神奇地分配块大小的事实令人困惑。我的背景是深度学习的小批量培训。因此,最理想的情况是每个块都是一个小批量

您需要设置一个适当的区块缓存,并将区块大小调整为您的读取或写入模式。这是一个非常常见的问题,应该添加到h5py文档中。看看