删除 table 不会释放 pytables 中的磁盘 space
Removing a table does not free disk space in pytables
我在pytables中创建了一个table,如下所示:
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。
现在,当我尝试删除 table 时,一切正常(最终文件大小约为 1KB)。
h5f = tb.open_file('enum.h5', 'a')
tbl = h5f.root.df
tbl.remove()
h5f.flush()
h5f.close()
但是,如果我将这个 table 的一部分复制到一个新的 table 并删除原来的 table,文件大小似乎会增加(到 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
以及释放 table 占用的磁盘 space? (我正在使用 pytables==3.6.1
)
是的,这种行为是意料之中的。查看此答案以查看相同行为的更详细示例:。请注意,如果您添加新数据集,space 将是 reclaimed/reused。
要回收文件中未使用的 space,您必须使用命令行实用程序。有 2 个选择:ptrepack
和 h5repack
:两者都用于一些外部文件操作。要在删除对象后减小文件大小,请从旧文件创建一个新文件,如下所示:
ptrepack
实用程序随 PyTables 提供。
- 此处参考:PyTables ptrepack doc
- 示例:
ptrepack file1.h5 file2.h5
(从 file1.h5 创建 file2.h5)
h5repack
来自 HDF Group 的实用程序。
- 此处参考:HDF5 h5repack doc
- 示例:
h5repack [OPTIONS] file1.h5 file2.h5
(从 file1.h5 创建 file2.h5)
两者都可以选择在创建新文件时使用不同的压缩方法,因此如果您想从压缩转换为未压缩(反之亦然),它们也很方便
我在pytables中创建了一个table,如下所示:
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。
现在,当我尝试删除 table 时,一切正常(最终文件大小约为 1KB)。
h5f = tb.open_file('enum.h5', 'a')
tbl = h5f.root.df
tbl.remove()
h5f.flush()
h5f.close()
但是,如果我将这个 table 的一部分复制到一个新的 table 并删除原来的 table,文件大小似乎会增加(到 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
以及释放 table 占用的磁盘 space? (我正在使用 pytables==3.6.1
)
是的,这种行为是意料之中的。查看此答案以查看相同行为的更详细示例:
要回收文件中未使用的 space,您必须使用命令行实用程序。有 2 个选择:ptrepack
和 h5repack
:两者都用于一些外部文件操作。要在删除对象后减小文件大小,请从旧文件创建一个新文件,如下所示:
ptrepack
实用程序随 PyTables 提供。- 此处参考:PyTables ptrepack doc
- 示例:
ptrepack file1.h5 file2.h5
(从 file1.h5 创建 file2.h5)
h5repack
来自 HDF Group 的实用程序。- 此处参考:HDF5 h5repack doc
- 示例:
h5repack [OPTIONS] file1.h5 file2.h5
(从 file1.h5 创建 file2.h5)
两者都可以选择在创建新文件时使用不同的压缩方法,因此如果您想从压缩转换为未压缩(反之亦然),它们也很方便