4.3 设置分块形状
你可以随意指定你的分块形状,不过首先要确保你会去阅读本章后面的性能实例。大多数时候,你会用到一些需要分块的功能比如压缩,或者你创建了可变形数据集,此时分块功能会被自动打开。这种情况下,h5py的自动分块器会帮你选择一个分块形状。
4.3.1 自动分块
如果你不想坐下来计算合适的分块形状,你可以设置chunks为True而不是提供一个元组。h5py会尝试猜一个形状:
自动分块器会尽量让分块保持一个N维方形,且限制在一定的范围以内。当你指定使用压缩器或其他过滤器而没有显式提供分块形状时,自动分块器也会被调用。
另外,保持N维方形是因为自动分块器不知道你打算如何使用数据集,不得不选一个风险最低的方案。对于那些只是想要压缩数据集而不关心细节的人来说,这样的形状正好。但对于那些访问模式比较特殊,且对时间有关键要求的人来说就不怎么合适了。
4.3.2 手动选择一个形状
这里是一些使用分块时需要记住的原理。选择分块形状的过程其实就是在权衡下面三个限制因素的过程:
1.数据集大小不变,分块越大,分块的B树索引越小,查找和读取分块的速度越快。
2.因为分块的读取是all-or-nothing(读取一个部分就是读取整个分块),所以分块越大,你把没用的数据读进内存的可能性越大。
3.HDF5分块缓存只能持有一定数量的分块。大于1MB的分块甚至无法被缓存。
所以请谨记下面这些要点:
你真的需要指定一个分块形状吗?
只有当你确信使用连续存储或自动分块的数据集会导致访问性能不佳的时候才手动选择分块形状。和所有优化一样,你需要做性能测试!
为你的数据集指定最自然的访问模式
在我们的例子里,数据集存储了一批图像,且知道应用程序会读取64×64大小的特定区块,那么你可以使用N×64×64(或N×128×128)的分块。
分块不要太小
记住HDF5会用索引数据来追踪每一个分块。如果你病态地选择1字节分块大小,你大部分的磁盘空间都会被索引占据。有一个经验法则认为对于大多数据集来说,一般需要保证分块大于10KB。
分块不要太大
关键要记住:从分块读取任何数据都会读取整个分块。如果你只是用了数据的一个子集,你就浪费了额外读取磁盘的时间。特别是大于1MB的分块无法被放入高速的“分块缓存”,于是不得不每次都从磁盘读取。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论