【问题标题】:Removing a table does not free disk space in pytables删除表不会释放 pytables 中的磁盘空间
【发布时间】:2021-08-09 06:04:56
【问题描述】:

我在 pytables 中创建了一个表,如下所示:

import tables as tb
import random
import time
h5f = tb.open_file('enum.h5', 'w')
class BallExt(tb.IsDescription): 
    ballTime = tb.Time32Col() 
    ballColor = tb.Int64Col()
tbl = h5f.create_table('/', 'df', BallExt)
now = time.time()
row = tbl.row
for i in range(10000): 
    row['ballTime'] = now + i 
    row['ballColor'] = int(random.choice([1,2,3,4,5]))  # take note of this 
    row.append()
tbl.flush()
h5f.close()

这个数据库在磁盘中的文件大小显示为133KB。

现在,当我尝试删除表时,一切正常(最终文件大小约为 1KB)。

h5f = tb.open_file('enum.h5', 'a')
tbl = h5f.root.df
tbl.remove()
h5f.flush()
h5f.close()

但是,如果我将此表的一部分复制到新表并删除原始表,文件大小似乎会增加(达到 263KB)。看起来唯一的一些引用被删除了,数据仍然存在于磁盘中。

h5f = tb.open_file('enum.h5', 'a')
tbl = h5f.root.df
new_tbl = h5f.create_table('/', 'df2', BallExt)
tbl.append_where(new_tbl, '(ballColor >= 3)')
tbl.remove()
h5f.flush()
h5f.close()

这是预期的吗?如果是这样,有没有办法删除tbl 以及释放表占用的磁盘空间? (我用的是pytables==3.6.1

【问题讨论】:

    标签: hdf5 pytables


    【解决方案1】:

    是的,这种行为是意料之中的。查看此答案以查看相同行为的更详细示例:How does HDF handle the space freed by deleted datasets without repacking。请注意,如果您添加新数据集,空间将被回收/重复使用。

    要回收文件中未使用的空间,您必须使用命令行实用程序。有两种选择:ptrepackh5repack:两者都用于许多外部文件操作。要在删除对象后减小文件大小,请从旧文件创建一个新文件,如下所示:

    • ptrepack 实用程序随 PyTables 一起提供。
      • 参考这里:PyTables ptrepack doc
      • 示例:ptrepack file1.h5 file2.h5(从 file1.h5 创建 file2.h5)
    • h5repack 来自 The HDF Group 的实用程序。
      • 参考这里:HDF5 h5repack doc
      • 示例:h5repack [OPTIONS] file1.h5 file2.h5(从 file1.h5 创建 file2.h5)

    在创建新文件时,两者都可以选择使用不同的压缩方法,因此如果您想从压缩转换为未压缩(反之亦然)也很方便

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多