我有一个原始的hdf5文件,其数据集的形状(3737,224,224,3)并不可扩展。即在创建期间没有传递maxshape参数。
我决定创建一个新的hdf5文件并使用maxshape =(None,224,224,3)创建数据集,这样我以后可以调整它的大小。然后我将数据集从原始hdf5复制到这个新数据集并保存。
两个hdf5的内容完全相同。然后我尝试回读所有数据,并发现可调整大小版本的性能显着下降。
原件: CPU时间:用户660毫秒,系统:2.58秒,总计:3.24秒 壁挂时间:6.08秒
可调整大小: CPU时间:用户18.6秒,系统:4.41秒,总计:23秒 待机时间: 49.5秒
这几乎是慢了10倍。这是预期的吗?文件大小差异仅小于2 MB。我需要注意哪些优化提示/技巧?
答案 0 :(得分:1)
在仔细阅读hdf5文档时,似乎如果在创建数据集期间指定了maxshape(使其在将来可以调整大小),也会打开块。这似乎是强制性的。默认情况下,它给出的“默认”分块大小是dataset.chunks =(234,14,28,1)。
根据文档,这意味着数据不是连续的,而是“随意地”存储在类似b树的结构中。这很可能解释了我观察到的缓慢,它可能比我想象的更多的额外i / o。
我通过传递“chunks =(3737,224,224,3)”将块大小设置为整个数据集大小,这一次,我得到了
CPU时间:用户809μs,sys:837 ms,总计:838 ms 壁挂时间:914毫秒
加载我的(3737,224,224,3)张量的速度很快。我有理解为什么分块是一种可扩展性解决方案。但它神奇地分配一个块大小的事实令人困惑。我的背景是深度学习的小批量培训。所以最好的事情是每个块都是一个小批量。