如何压缩保存在 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 中的数据帧打开?