HDF如何在不重新打包的情况下处理已删除数据集

How does HDF handle the space freed by deleted datasets without repacking(HDF如何在不重新打包的情况下处理已删除数据集释放的空间)

本文介绍了HDF如何在不重新打包的情况下处理已删除数据集释放的空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我特别指的是与使用Pyables/Pandas接口的HDF,但我认为这适用于一般的HDF。

我知道,一旦删除数据集,HDF就不会回收空间,您必须使用h5repack/ptrepack来回收该空间。我对这种方法的问题是,我发现这些工具非常慢,特别是对于几十亿字节(我的文件大约是20 GB)的文件。因此,如果您必须有规律地添加/删除派生数据集(例如,在调试构成该数据的东西时),这是不实际的。

所以-我的问题是,如果文件没有重新打包,删除数据集的空间会发生什么?直到你重新打包文件,它才会丢失吗?是否将其标记为可供下次尝试在SQL中写入内容时存储?换句话说,释放出来的空间有用吗,或者你只是需要时不时地重新打包文件?

推荐答案

我不知道PyTables背后的代码,所以不能给出官方的开发答案。在谷歌群组网站上问一问,Francesc Alted可能会回答。 在此期间,我写了一个小测试来锻炼这种行为。下面的例子已经被修改,以符合我在11月8日的评论。它现在创建3个HDF5文件:

  1. 在第一个表中,它创建了5个表
  2. 在第二个中,它创建5个表,然后删除它们,然后再创建5个表(具有不同的名称)
  3. 在第三个中,创建了5个表,并关闭了文件。重新打开该文件,删除5个表,然后关闭该文件。文件被重新打开,又创建了5个表(具有不同的名称)。

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

简单示例如下: 在我的测试中,文件_1、_2和_3都是114 MB。

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)

with tb.File('SO_58736920_3.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_3.h5','r+') as h5f:
        h5f.root.test1._f_remove()
        h5f.root.test2._f_remove()
        h5f.root.test3._f_remove()
        h5f.root.test4._f_remove()
        h5f.root.test5._f_remove()

with tb.File('SO_58736920_3.h5','r+') as h5f:
        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)

这篇关于HDF如何在不重新打包的情况下处理已删除数据集释放的空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:HDF如何在不重新打包的情况下处理已删除数据集

基础教程推荐