【问题标题】:Compression performance related to chunk size in hdf5 fileshdf5 文件中与块大小相关的压缩性能
【发布时间】:2013-05-23 02:13:11
【问题描述】:

我想问一个关于压缩性能的问题 这与 hdf5 文件的块大小有关。

我手头有 2 个 hdf5 文件,它们具有以下属性。 它们都只包含一个数据集,称为“数据”。

文件 A 的“数据”:

  1. 类型:HDF5 标量数据集
  2. 没有。尺寸:2
  3. 尺寸尺寸:5094125 x 6
  4. 最大。尺寸大小:无限 x 无限
  5. 数据类型:64 位浮点数
  6. 分块:10000 x 6
  7. 压缩:GZIP 级别 = 7

文件 B 的“数据”:

  1. 类型:HDF5 标量数据集
  2. 没有。尺寸:2
  3. 尺寸尺寸:6720 x 1000
  4. 最大。尺寸大小:无限 x 无限
  5. 数据类型:64 位浮点数
  6. 分块:6000 x 1
  7. 压缩:GZIP 级别 = 7

文件 A 的大小: HDF5----19 MB CSV-----165 MB

文件 B 的大小: HDF5----60 MB CSV-----165 MB

与 csv 文件相比,它们都显示出对存储数据的极大压缩。 但是文件A的压缩率是原始csv的10%左右, 而文件B的只有原始csv的30%左右。

我尝试了不同的块大小以使文件 B 尽可能小,但似乎 30% 是最佳压缩率。我想问为什么文件A可以实现更大的压缩而文件B不能。

如果文件B也能实现,那么chunk size应该是多少?

是否有任何规则可以确定用于压缩目的的 HDF5 的最佳块大小?

谢谢!

【问题讨论】:

标签: compression hdf5 chunking


【解决方案1】:

分块并不会真正影响压缩率本身,除了@Ümit 描述的方式。分块的作用是影响 I/O 性能。当压缩应用于 HDF5 数据集时,它会单独应用于整个块。这意味着当从数据集中的单个块读取数据时,必须解压缩整个块 - 可能涉及更多的 I/O,具体取决于缓存的大小、块的形状等。

您应该做的是确保块 shape 与您读取/写入数据的方式相匹配。例如,如果您通常一次阅读一列,请制作您的块列。 This is a good tutorial on chunking.

【讨论】:

  • 我同意分块与 I/O 性能的关系比压缩性能更重要。对于 I/O 性能,我还有一个问题,如果数据集的维度是固定的,比如 10000 x 6,我认为 (1000,6) 的块大小是合适的,因为我逐行读取它。但是,如果维度本质上是动态的,请拒绝。列和行的数量将随着时间的推移而增加。块大小应该是多少?
  • 是的,尺寸不错。它们每次都增加固定的数量吗?如果他们这样做,我建议从那个尺寸开始。例如,如果您总是将尺寸增加 (500, 3),则将块设为 (500, 3)。这还取决于您是否阅读多于写作,反之亦然。例如,如果它是一次写入、多次读取,请让您的块符合您读取数据的方式。当然,您可能仍想进行一些测量并优化您的块大小!
  • 也不同于一般的看法,压缩实际上可以提高读取性能。但这只是假设您的块大小与您读取数据的方式相对应(请参阅@Yossarian cmets)。读取压缩数据可能比未压缩数据更快的原因是因为快速多线程压缩库(即 pyTables 中的 blosc 或 h5py 中的 lzf)非常快速且高效。对于庞大的数据集,I/O 实际上是瓶颈,而不是与压缩相关的 CPU 性能。请参阅this 文章。
  • 我明白了。我创建了几个具有相同数据和不同块大小的 hdf5 文件,并比较了它们的文件大小和读取时间长度。可以在读取性能良好的情况下实现高压缩。我计划按每次读取的估计维度对数据进行分块。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2016-11-04
  • 2013-05-13
  • 2019-01-26
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多