如何压缩保存在 hdf5 中的数据?

Posted

技术标签:

【中文标题】如何压缩保存在 hdf5 中的数据?【英文标题】:How to compress the data that saved in hdf5? 【发布时间】:2018-02-26 22:57:29 【问题描述】:

我正在使用 python 2.7 读取视频并存储在 hdf5 中。这是我的代码

import h5py
import skvideo.datasets
import skvideo.io
videodata = skvideo.io.vread('./v_ApplyEyeMakeup_g01_c01.avi')
with h5py.File('./video.hdf5','w') as f:
    f['data'] = videodata
    f['label'] = 1

问题是输出的hdf5太大了。它比原始的 avi 文件大 128 倍。我应该怎么做才能压缩/减小尺寸?您可以在https://drive.google.com/open?id=0B1MrjZsURl2yNFM0ZTJfZ3pOZVU下载文件

我认为我们可以使用压缩它

f.create_dataset('data',data=videodata,compression='gzip',compression_opts=9)
f.create_dataset('label', data=1)

现在,它仍然是原始文件的 37 倍。提前致谢。

【问题讨论】:

您好,尝试沿时间维度添加分块,应该可以提高压缩率。 能否根据我的代码提供代码 【参考方案1】:

通过添加分块,我能够使输出为 7.2M,而没有时为 10M。所以它肯定会有所改善,但仍远非专用视频格式。您可以使用来自https://support.hdfgroup.org/services/filters.html 的其他过滤器,但我怀疑它们是否会将压缩提高一个数量级。所以如果你想继续使用 h5py,你可能需要接受更大的文件大小。如果这不可接受,请尝试其他文件格式。

import h5py
import skvideo.datasets
import skvideo.io
videodata = skvideo.io.vread('./v_ApplyEyeMakeup_g01_c01.avi')

print(videodata.shape)
with h5py.File('./video.hdf5','w') as f:
    f.create_dataset('data',
                      data=videodata,
                      compression='gzip',
                      compression_opts=9,
                      chunks=(164, 20, 20, 3))
    f.create_dataset('label', data=1)

【讨论】:

【参考方案2】:

您的问题应该使用适合您的视频文件的编码来解决。根据您的业务,有各种编码算法,例如 x265 可以压缩视频,但需要大量资源才能做到这一点。看看here。

最近我听说了另一个有趣的编码,它很适合在线流媒体,叫做 Daala,你可以在here 获得更多信息。

通常这取决于您对编码的期望,但选择一个好的编码器是您应该走的路,尝试搜索。

【讨论】:

以上是关于如何压缩保存在 hdf5 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?

如何有效地将数据附加到 C 中的 HDF5 表?

如何从 hdf5 保存/提取数据集并转换为 TiFF?

HDF5:将线性数组保存到三维数据集

pandas - 如何仅将 DataFrame 的选定列保存到 HDF5

hdf5 和 pickle 比原始 csv 文件占用更多空间