使用 pytables 或 pandas 删除表或节点后释放 hdf5 磁盘内存

问题描述 投票:0回答:2

我正在将 HDFStore 与 pandas / pytables 一起使用。

删除表或对象后,hdf5 文件大小不受影响。当添加额外的对象来存储时,这个空间似乎会被重用,但如果浪费大量空间,这可能会成为一个问题。

我在 pandas 或 pytables API 中没有找到任何可用于恢复 hdf5 内存的命令。

您知道有什么机制可以改进 hdf5 文件中的数据管理吗?

python pandas hdf5 pytables
2个回答
11
投票

参见这里

您需要

ptrepack
它,这会重写文件。

ptrepack --chunkshape=auto --propindexes --complevel=9 --complib=blosc in.h5 out.h5

作为示例(这也会压缩文件)。


0
投票

这是一个基于@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)
© www.soinside.com 2019 - 2024. All rights reserved.