Compression 为什么即使所有的数据集都在压缩文件中,压缩HDF5文件仍能获得很好的压缩效果?

Compression 为什么即使所有的数据集都在压缩文件中,压缩HDF5文件仍能获得很好的压缩效果?,compression,hdf5,h5py,pytables,hdf,Compression,Hdf5,H5py,Pytables,Hdf,我在桌面应用程序中使用HDF5文件系统。我对文件中的所有数据集使用了GZIP 5级压缩 但是仍然当我使用7zip压缩HDF5文件时,文件大小变得更小了大约一半到三分之一 我遵循的过程是: 生成HDF5文件 导入文件中的数据 使用h5repack实用程序释放未计算的空间(如果有) 使用7zip,我将文件压缩到.zip 怎么可能呢 更多压缩的范围在哪里 如何生成更小的HDF5文件?关于使用性质(H5P)的任何建议 我认为7zip可能会使用GZIP级别9无情地压缩我的文件,但我尝试在我的HDF5文件中

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

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

我遵循的过程是:

  • 生成HDF5文件
  • 导入文件中的数据
  • 使用h5repack实用程序释放未计算的空间(如果有)
  • 使用7zip,我将文件压缩到.zip
  • 怎么可能呢

    更多压缩的范围在哪里

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


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

    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
    
    %dd ibs=1计数=1000000零
    %wc-c零点
    1000000
    %gzip<0 | wc-c
    1003
    %gzip

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

    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
    
    %dd ibs=1计数=1000000零
    %wc-c零点
    1000000
    %gzip<0 | wc-c
    1003
    %gzip

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

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

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

    Mark,HDF5以一种非常不同的方式使用压缩。例如,我们压缩3个
    .docx
    文件(file1.docx、file2.docx、file3.docx),得到一个压缩文件(document.zip)。所以一个zip容器有3个文件。现在,当您必须使用file2.docx时,您将解压缩documents.zip,然后使用file2.docx。因此,这是在多个文件上应用压缩的情况。没关系。你没有回答我的问题。HDF5文件的压缩比是多少?压缩比在HDF5文件内部变化,取决于分块。在我的例子中,不同的组有不同类型的复合数据集。因此,我在每个数据集中使用不同的块大小。因此,在使用GZIP级别5的一个HDF5文件中,压缩比从2:1到47:1不等。此文件大小为3.14 MB。如果我压缩这个3.14MB的HDF5文件,压缩文件的大小是1.27MB。那么您就没有使gzip压缩能力饱和的条目。另一个答案是,文件中有很大一部分根本没有被压缩,这可能就是原因。请注意,HDF5以一种非常不同的方式使用压缩。例如,我们压缩3个
    .docx
    文件(file1.docx、file2.docx、file3.docx),得到一个压缩文件(document.zip)。所以一个zip容器有3个文件。现在,当您必须使用file2.docx时,您将解压缩documents.zip,然后使用file2.docx。因此,这是在多个文件上应用压缩的情况。没关系。你没有回答我的问题。HDF5文件的压缩比是多少?压缩比在HDF5文件内部变化,取决于分块。在我的例子中,不同的组有不同类型的复合数据集。因此,我在每个数据集中使用不同的块大小。因此,在使用GZIP级别5的一个HDF5文件中,压缩比从2:1到47:1不等。此文件大小为3.14 MB。如果我压缩这个3.14MB的HDF5文件,压缩文件的大小是1.27MB。那么您就没有使gzip压缩能力饱和的条目。另一个答案是,文件中有很大一部分根本没有被压缩,这可能是原因所在。每个数据块都是单独压缩的。所以第一个问题是,你的块大小/形状是什么?你用洗牌,对吗?(否则压缩比会差得多)是的,我在压缩前使用shuffle。我每个数据集存储10k个点,我使用的数据块大小为5k。每个数据块都是单独压缩的。所以第一个问题是,你的块大小/形状是什么?你用洗牌,对吗?(否则压缩比会差得多)是的,我在压缩前使用shuffle。我正在为每个数据集存储10k个点,并使用5k的块大小。