我正在将 HDFStore 与 pandas / pytables 一起使用。
删除表或对象后,hdf5 文件大小不受影响。当添加额外的对象来存储时,这个空间似乎会被重用,但如果浪费大量空间,这可能会成为一个问题。
我在 pandas 或 pytables API 中没有找到任何可用于恢复 hdf5 内存的命令。
您知道有什么机制可以改进 hdf5 文件中的数据管理吗?
参见这里
您需要
ptrepack
它,这会重写文件。
ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc in.h5 out.h5
作为示例(这也会压缩文件)。
这是一个基于@0_0建议的Python解决方案(来自HDF5文件的交叉发布在覆盖pandas数据帧后会变大):
def cache_repack(cachefile='/tmp/influx2web_store.h5'):
"""
Clean up cache, HDF5 does not reclaim space automatically, so once per run repack the data to do so.
See
1. https://stackoverflow.com/questions/33101797/hdf5-file-grows-in-size-after-overwriting-the-pandas-dataframe
2. https://stackoverflow.com/questions/21090243/release-hdf5-disk-memory-after-table-or-node-removal-with-pytables-or-pandas
3. https://pandas.pydata.org/docs/user_guide/io.html#delete-from-a-table
4. http://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-hdf5-ptrepack
"""
from subprocess import call
outcachefile = cachefile + '-repacked'
command = ["ptrepack", "-o", "--chunkshape=auto", "--propindexes", "--complevel=9", "--complib=blosc", cachefile, outcachefile]
call(command)
# Use replace instead of rename to clobber target https://stackoverflow.com/questions/69363867/difference-between-os-replace-and-os-rename
import os
os.replace(outcachefile, cachefile)