我曾多次读到,在 HDF5 中打开压缩可以带来更好的读/写性能。
我想知道什么理想的设置可以在以下位置实现良好的读/写性能:
data_df.to_hdf(..., format='fixed', complib=..., complevel=..., chunksize=...)
我已经在使用了fixed
格式(即h5py
)因为它比table
。我有强大的处理器,不太关心磁盘空间。
我经常储存DataFrame
s of float64
and str
键入大约的文件。 2500 行 x 9000 列。
您可以使用几种可能的压缩过滤器。
自从HDF5 版本 1.8.11 https://support.hdfgroup.org/HDF5/faq/compression.html您可以轻松注册第 3 方压缩过滤器。
关于性能:
这可能取决于您的访问模式,因为您可能希望为块定义适当的维度,以便它与您的访问模式很好地保持一致,否则您的性能将受到很大影响。例如,如果您知道您通常访问一列和所有行,您应该相应地定义块形状(1,9000)
. See here http://www.pytables.org/usersguide/optimization.html, here https://www.hdfgroup.org/HDF5/doc/Advanced/Chunking/ and here https://www.hdfgroup.org/training/HDFtraining/UsersGuide/Perform.fm2.html一些信息。
然而 AFAIK pandas 通常最终会将整个 HDF5 文件加载到内存中,除非您使用read_table
and an iterator
(see here https://stackoverflow.com/questions/15692984/pandas-large-data-hdf-tables-and-memory-usage-when-calling-a-function)或者自己做部分IO(参见here https://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas),因此定义一个好的块大小并没有真正带来多大好处。
尽管如此,您仍然可以从压缩中受益,因为将压缩数据加载到内存并使用 CPU 解压缩可能比加载未压缩数据更快。
关于你原来的问题:
我建议看一下Blosc http://www.blosc.org/。它是一个多线程元压缩器库,支持各种不同的压缩过滤器:
- BloscLZ:内部默认压缩器,很大程度上基于 FastLZ。
- LZ4:紧凑、非常流行且快速的压缩器。
- LZ4HC:LZ4 的调整版本,以牺牲速度为代价产生更好的压缩比。
- Snappy:一种在很多地方使用的流行压缩器。
- Zlib:经典;比以前的速度稍慢,但实现了更好的压缩比。
它们具有不同的优势,最好的办法是尝试用您的数据对它们进行基准测试,看看哪种效果最好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)