HDF如何处理删除的数据集释放的空间而无需重新打包

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

我特别指的是与使用Pytables / Pandas交互的HDF,但我认为这通常适用于HDF。

我知道删除数据集后HDF不会回收空间,并且您必须使用h5repack / ptrepack来回收该空间。该方法的问题在于,我发现这些工具的运行速度非常慢,尤其是对于数千兆字节(我的文件约为20 GB)的文件。因此,如果您必须以某种规律性添加/删除派生数据集(例如,在调试生成该数据的事物时),这是不切实际的]

所以-我的问题是,如果不重新打包文件,删除数据集的空间会发生什么?在重新打包文件之前,它是否会丢失?下次您尝试将某些内容写入a-la SQL时是否将其标记为可用于存储?换句话说-释放的空间是否全部有用,还是您只需要经常重新打包文件?

python pandas hdf5 pytables
1个回答
0
投票

我不了解PyTables背后的代码,因此无法给出正式的PyTables开发答案。在PyTables Google网上论坛上询问,Francesc Alted可能会回答。在此期间,我编写了一个小测试以测试行为。它创建2个HDF5文件:

  1. 在第一个中,它创建5个表
  2. 在第二个表中,它创建5个表,然后将其删除,然后再创建5个表(使用不同的名称)

生成的文件大小相同。我的结论是:当新表与已删除表的大小相同时,PyTables足够聪明,可以回收分配的(但未使用的)空间。我怀疑如果新表更大,您可能会得到不同的结果。

下面的简单示例:在我的测试中,文件1和2均为114MB。

import tables as tb
import numpy as np

data1  = np.arange(1000000.)
data2  = 2.0*data1
data3  = 3.0*data1

ds_dt = np.dtype({'names':['data1', 'data2', 'data3'],
                  'formats':[(float), (float), (float)] }) 

rec_arr = np.rec.fromarrays([data1, data2, data3], dtype=ds_dt)

with tb.File('SO_58736920_1.h5','w') as h5f:
        tb1 = h5f.create_table('/','test1',obj=rec_arr)
        tb2 = h5f.create_table('/','test2',obj=rec_arr)
        tb3 = h5f.create_table('/','test3',obj=rec_arr)
        tb4 = h5f.create_table('/','test4',obj=rec_arr)
        tb5 = h5f.create_table('/','test5',obj=rec_arr)

with tb.File('SO_58736920_2.h5','w') as h5f:
        tb1 = h5f.create_table('/','test1',obj=rec_arr)
        tb2 = h5f.create_table('/','test2',obj=rec_arr)
        tb3 = h5f.create_table('/','test3',obj=rec_arr)
        tb4 = h5f.create_table('/','test4',obj=rec_arr)
        tb5 = h5f.create_table('/','test5',obj=rec_arr)
        tb1._f_remove()
        tb2._f_remove()
        tb3._f_remove()
        tb4._f_remove()
        tb5._f_remove()

        tb11 = h5f.create_table('/','test11',obj=rec_arr)
        tb12 = h5f.create_table('/','test12',obj=rec_arr)
        tb13 = h5f.create_table('/','test13',obj=rec_arr)
        tb14 = h5f.create_table('/','test14',obj=rec_arr)
        tb15 = h5f.create_table('/','test15',obj=rec_arr)
© www.soinside.com 2019 - 2024. All rights reserved.