gpt4 book ai didi

numpy - 与不可调整大小相比,加载具有可调整长度的 hdf5 非常慢

转载 作者:行者123 更新时间:2023-12-04 08:33:05 26 4
gpt4 key购买 nike

我有一个原始的 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。是否有我需要注意的优化提示/技巧?

最佳答案

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

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

我通过传递“chunks=(3737, 224, 224, 3)”将块大小设置为整个数据集大小,这一次,我得到了

CPU 时间:用户 809 µs,系统:837 毫秒,总计:838 毫秒
挂墙时间:914 毫秒

这大大加快了加载我的 (3737, 224, 224, 3) 张量的速度。我有点理解为什么分块是一种可扩展性解决方案。但它神奇地分配块大小的事实令人困惑。我的背景是深度学习的小批量训练。所以最好的事情是每个块都是一个小批量。

关于numpy - 与不可调整大小相比,加载具有可调整长度的 hdf5 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com