我特别指的是与使用Pytables / Pandas交互的HDF,但我认为这通常适用于HDF。
我知道删除数据集后HDF不会回收空间,并且您必须使用h5repack / ptrepack来回收该空间。该方法的问题在于,我发现这些工具的运行速度非常慢,尤其是对于数千兆字节(我的文件约为20 GB)的文件。因此,如果您必须以某种规律性添加/删除派生数据集(例如,在调试生成该数据的事物时),这是不切实际的]
所以-我的问题是,如果不重新打包文件,删除数据集的空间会发生什么?在重新打包文件之前,它是否会丢失?下次您尝试将某些内容写入a-la SQL时是否将其标记为可用于存储?换句话说-释放的空间是否全部有用,还是您只需要经常重新打包文件?
我不了解PyTables背后的代码,因此无法给出正式的PyTables开发答案。在PyTables Google网上论坛上询问,Francesc Alted可能会回答。在此期间,我编写了一个小测试以测试行为。它创建2个HDF5文件:
生成的文件大小相同。我的结论是:当新表与已删除表的大小相同时,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)