对于 HDF5 的快速读/写性能推荐的压缩是啥(在 Python/pandas 中)?

Posted

技术标签:

【中文标题】对于 HDF5 的快速读/写性能推荐的压缩是啥(在 Python/pandas 中)?【英文标题】:What is the recommended compression for HDF5 for fast read/write performance (in Python/pandas)?对于 HDF5 的快速读/写性能推荐的压缩是什么(在 Python/pandas 中)? 【发布时间】:2015-10-01 16:52:10 【问题描述】:

我已多次阅读,在 HDF5 中打开压缩可以带来更好的读/写性能。

我想知道什么理想的设置可以在以下位置获得良好的读/写性能:

 data_df.to_hdf(..., format='fixed', complib=..., complevel=..., chunksize=...)

我已经在使用fixed 格式(即h5py),因为它比table 快。我有强大的处理器,不太关心磁盘空间。

我经常将 DataFrames 的 float64str 类型存储在大约 1 个文件中。 2500 行 x 9000 列。

【问题讨论】:

压缩级别基本上是处理速度和使用的磁盘之间的权衡。如果您有快速的处理器并且不关心磁盘空间,那么这并不重要,只需让它使用默认值即可。当然,这是 YMMV 的事情之一,除了尝试几种不同的压缩级别并查看对您的特定数据最好的方法之外,这是无可替代的。还要检查每个级别的读写性能,因为这不会是对称的。 默认是无压缩,我很确定我可以改进 ;-) 我必须自己尝试,但会欣赏良好的直觉......一些压缩算法有利于其他人的速度用于压缩级别。也不确定块大小实际上会影响什么,或者压缩是否真的适用于str,因为我相信它存储为Object。我还必须在几台不同的机器上运行它。 我的目的是提高执行时间。而且我很确定我也可以通过应用压缩来改进这一点(例如,AHL 使用 lz4 来加速存储数据)。 对,我认为就直接执行时间而言,尝试不同类型和级别的压缩并没有太多替代品,尽管也许其他人会有一些一般性的指示。就字符串而言,您可能还希望将它们存储为分类值。这大致相当于字符串压缩,但在将数据帧加载到内存时也会使您受益,而不仅仅是在存储时 找到了两个相似的线程(hdf5 concurrency 和pytables write performance)。在示例中使用blosc 压缩似乎达到/超过了不压缩的性能。 【参考方案1】:

您可以使用几种可能的压缩过滤器。 由于HDF5 version 1.8.11,您可以轻松注册第 3 方压缩过滤器。

关于性能:

这可能取决于您的访问模式,因为您可能希望为块定义适当的尺寸,以便它与您的访问模式很好地对齐,否则您的性能将受到很大影响。例如,如果您知道您通常访问一列和所有行,您应该相应地定义您的块形状(1,9000)。有关一些信息,请参阅here、here 和 here。

但是,AFAIK pandas 通常最终会将整个 HDF5 文件加载到内存中,除非您使用 read_tableiterator(请参阅 here)或自己执行部分 IO(请参阅 here),因此不会定义一个好的块大小并没有那么大的好处。

尽管如此,您仍可能从压缩中受益,因为将压缩数据加载到内存并使用 CPU 解压缩可能比加载未压缩数据更快。

关于你原来的问题:

我建议看看Blosc。它是一个多线程元压缩器库,支持各种不同的压缩过滤器:

BloscLZ:内部默认压缩器,主要基于 FastLZ。 LZ4:紧凑、非常流行和快速的压缩器。 LZ4HC:LZ4 的调整版本,以牺牲速度为代价产生更好的压缩比。 Snappy:在很多地方使用的流行压缩器。 Zlib:经典;比以前的速度稍慢,但实现了更好的压缩比。

这些具有不同的优势,最好的办法是尝试用您的数据对它们进行基准测试,看看哪种效果最好。

【讨论】:

太棒了! chunksize 的经验法则是有道理的,事实上我一直在读取整个数据,因为我使用的是 fixed 格式(我在文件系统级别上做块)。现在我明白为什么我找到的所有示例都使用blosc,谢谢! 我认为pandas之所以将整个文件读入内存与你是否使用fixed无关。它是这样设计的。要在 pandas(summean)中进行统计,pandas 需要读取整个数据集。您可以下拉到PyTables,它支持不会将整个数据集读入内存但只能逐块读取的查询(但是您将没有方便的 panda 函数)。或者对于不适合内存的数据集Blaze 可能是一个很好的解决方案。 chunks=(1, 9000) 不是意味着您访问一行和所有列吗?由于 HDF5 是按行优先顺序组织的。

以上是关于对于 HDF5 的快速读/写性能推荐的压缩是啥(在 Python/pandas 中)?的主要内容,如果未能解决你的问题,请参考以下文章

限制 TerichDB 的写速度

推荐一款 Facebook 开源的高性能压缩工具 Zstd (支持 macOS/Linux/Windows 全平台)

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

在 hdf5 中存储可变长度字符串列表的标准方法是啥?

在 hdf5save 中保存会创建一个不可读的文件

在 Windows 上将 NetCDF 转换为 HDF5 的最简单方法是啥