【问题标题】:Why zipping HDF5 file is still getting a good amount of compression even if all datasets are compressed inside the file?为什么即使所有数据集都压缩在文件中,压缩 HDF5 文件仍能获得大量压缩?
【发布时间】:2019-01-26 15:26:49
【问题描述】:

我在我的桌面应用程序中使用 HDF5 文件系统。我对文件中的所有数据集都使用了 GZIP 5 级压缩。

但仍然当我使用 7zip 压缩 HDF5 文件时,文件大小变得更小了大约一半到三分之一!!!

我正在遵循的过程是:

  1. 生成 HDF5 文件。
  2. 在文件中导入数据。
  3. 使用 h5repack 实用程序释放未计入的空间(如果有)。
  4. 我使用 7zip 将文件压缩为 .zip

这怎么可能?

更多压缩的范围在哪里?

如何生成更小的 HDF5 文件?关于使用属性(H5P)的任何建议。

我认为 7zip 可能会使用 GZIP 级别 9 无情地压缩我的文件,但我尝试在我的 HDF5 文件中使用 GZIP 级别 9。新文件大小仍然是原来的一半。

【问题讨论】:

  • 每个数据块,都是自己压缩的。所以第一个问题是,你的块大小/形状是什么?你确实使用洗牌吗? (否则压缩比会差很多)
  • 是的,我在压缩之前使用随机播放。我每个数据集存储 10k 个点,并且我使用 5k 的块大小。

标签: compression hdf5 h5py pytables hdf


【解决方案1】:

gzip 的最大压缩比约为 1000:1。如果数据比这更可压缩,那么您可以再次压缩它以获得更多压缩(第二次可以再次使用 gzip)。你可以用一个只包含零的文件做一个简单的实验:

% dd ibs=1 count=1000000 < /dev/zero > zeros
% wc -c zeros
1000000
% gzip < zeros | wc -c
1003
% gzip < zeros | gzip | wc -c
64

那么你第一次压缩的压缩比是多少?

【讨论】:

  • 马克,HDF5 以一种非常不同的方式使用压缩。例如,我们压缩 3 个.docx 文件(file1.docx,file2.docx,file3.docx),我们得到一个 zip(document.zip)。所以一个 zip 容器有 3 个文件。现在,当您必须使用file2.docx 时,您将解压缩documents.zip,然后使用file2.docx。因此,这是对多个文件应用压缩的情况。
  • 没关系。你没有回答我的问题。 HDF5文件的压缩比是多少?
  • 压缩比在 HDF5 文件中有所不同,取决于分块。就我而言,不同的组有不同类型的复合数据集。所以我在每个数据集中使用不同的块大小。因此,使用 GZIP 级别 5 的一个 HDF5 文件中的压缩比从 2:1 变化到 47:1。这个文件大小为 3.14 MB。如果我压缩这个 3.14 MB HDF5 文件,压缩文件大小为 1.27MB。
  • 那么您没有使 gzip 压缩能力饱和的条目。另一个答案是您的文件有很大一部分根本没有压缩,这可能是原因。
【解决方案2】:

您仅对 HDF5 文件中的数据集元素应用压缩。 HDF5 文件的其他组件(内部元数据和对象,例如组)不会被压缩。因此,当您压缩整个文件时,其他组件也会压缩,而已经压缩的数据集元素也可能会压缩更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多