对于快速 read/write 性能(在 Python/pandas 中),HDF5 的推荐压缩是什么?
What is the recommended compression for HDF5 for fast read/write performance (in Python/pandas)?
我读过好几遍,在 HDF5 中打开压缩可以带来更好的 read/write 性能。
我想知道什么样的理想设置可以在以下位置实现良好的 read/write 性能:
data_df.to_hdf(..., format='fixed', complib=..., complevel=..., chunksize=...)
我已经在使用 fixed
格式(即 h5py
),因为它比 table
快。我有强大的处理器,不太关心磁盘 space。
我经常将 float64
和 str
类型的 DataFrame
存储在大约 . 2500 行 x 9000 列。
您可以使用几个可能的压缩过滤器。
由于 HDF5 version 1.8.11 您可以轻松注册第 3 方压缩过滤器。
关于性能:
这可能取决于您的访问模式,因为您可能想为您的块定义适当的维度,以便它与您的访问模式保持一致,否则您的性能将受到很大影响。例如,如果你知道你通常访问一列和所有行,你应该相应地定义你的块形状 (1,9000)
。有关一些信息,请参阅 here, here and here。
但是 AFAIK pandas 通常最终会将整个 HDF5 文件加载到内存中,除非您使用 read_table
和 iterator
(参见 here) or do the partial IO yourself (see here),因此不会'定义一个好的块大小并没有那么大的好处。
尽管如此,您仍然可以从压缩中获益,因为将压缩数据加载到内存并使用 CPU 对其进行解压缩可能比加载未压缩数据更快。
关于你原来的问题:
我建议看一下 Blosc。它是一个多线程元压缩器库,支持各种不同的压缩过滤器:
- BloscLZ:内部默认压缩器,主要基于 FastLZ。
- LZ4:一款紧凑、非常流行且快速的压缩器。
- LZ4HC:LZ4 的调整版本,以牺牲速度为代价产生更好的压缩比。
- Snappy:一种在许多地方使用的流行压缩器。
- Zlib:经典;比以前的慢一些,但压缩率更高。
它们各有优势,最好的办法是尝试用您的数据对它们进行基准测试,看看哪个效果最好。
我读过好几遍,在 HDF5 中打开压缩可以带来更好的 read/write 性能。
我想知道什么样的理想设置可以在以下位置实现良好的 read/write 性能:
data_df.to_hdf(..., format='fixed', complib=..., complevel=..., chunksize=...)
我已经在使用 fixed
格式(即 h5py
),因为它比 table
快。我有强大的处理器,不太关心磁盘 space。
我经常将 float64
和 str
类型的 DataFrame
存储在大约 . 2500 行 x 9000 列。
您可以使用几个可能的压缩过滤器。 由于 HDF5 version 1.8.11 您可以轻松注册第 3 方压缩过滤器。
关于性能:
这可能取决于您的访问模式,因为您可能想为您的块定义适当的维度,以便它与您的访问模式保持一致,否则您的性能将受到很大影响。例如,如果你知道你通常访问一列和所有行,你应该相应地定义你的块形状 (1,9000)
。有关一些信息,请参阅 here, here and here。
但是 AFAIK pandas 通常最终会将整个 HDF5 文件加载到内存中,除非您使用 read_table
和 iterator
(参见 here) or do the partial IO yourself (see here),因此不会'定义一个好的块大小并没有那么大的好处。
尽管如此,您仍然可以从压缩中获益,因为将压缩数据加载到内存并使用 CPU 对其进行解压缩可能比加载未压缩数据更快。
关于你原来的问题:
我建议看一下 Blosc。它是一个多线程元压缩器库,支持各种不同的压缩过滤器:
- BloscLZ:内部默认压缩器,主要基于 FastLZ。
- LZ4:一款紧凑、非常流行且快速的压缩器。
- LZ4HC:LZ4 的调整版本,以牺牲速度为代价产生更好的压缩比。
- Snappy:一种在许多地方使用的流行压缩器。
- Zlib:经典;比以前的慢一些,但压缩率更高。
它们各有优势,最好的办法是尝试用您的数据对它们进行基准测试,看看哪个效果最好。