【问题标题】:How do I truncate an EARRAY in an HDF5 file using pytables?如何使用 pytables 截断 HDF5 文件中的 EARRAY?
【发布时间】:2015-11-22 04:45:39
【问题描述】:

我有一个 HDF5 文件,其中包含一个非常大的 EARRAY,我想截断它以节省磁盘空间并更快地处理它。我在包含 EARRAY 的节点上使用 truncate 方法。 pytables 报告该数组已被截断,但仍占用相同数量的磁盘空间。

截断前的目录列表:

$ ll total 3694208
-rw-rw-r-- 1 chris        189 Aug 27 13:03 main.py
-rw-rw-r-- 1 chris 3782858816 Aug 27 13:00 original.hdf5

我用来截断的脚本(main.py):

import tables
filename = 'original.hdf5'
h5file = tables.open_file(filename, 'a')
print h5file
node = h5file.get_node('/recordings/0/data')
node.truncate(30000)
print h5file
h5file.close()

脚本的输出。正如预期的那样,EARRAY 从非常大变小。

original.hdf5 (File) ''
Last modif.: 'Thu Aug 27 13:00:12 2015'
Object Tree: 
/ (RootGroup) ''
/recordings (Group) ''
/recordings/0 (Group) ''
/recordings/0/data (EArray(43893300, 43)) ''
/recordings/0/application_data (Group) ''

original.hdf5 (File) ''
Last modif.: 'Thu Aug 27 13:00:12 2015'
Object Tree: 
/ (RootGroup) ''
/recordings (Group) ''
/recordings/0 (Group) ''
/recordings/0/data (EArray(30000, 43)) ''
/recordings/0/application_data (Group) ''

但文件占用的磁盘空间几乎完全相同:

ll
total 3693196
-rw-rw-r-- 1 chris        189 Aug 27 13:03 main.py
-rw-rw-r-- 1 chris 3781824064 Aug 27 13:03 original.hdf5

我做错了什么?如何回收这些磁盘空间?

如果有办法直接修改earray的内容,而不是使用truncate方法,这对我来说就更有用了。像 node = node[idx1:idx2, :] 这样的东西,这样我就可以选择我想要保留的数据块。但是当我使用这种语法时,变量node 只是变成了一个numpy 数组并且hdf5 文件没有被修改。

【问题讨论】:

    标签: python numpy hdf5 pytables


    【解决方案1】:

    正如this question 中所讨论的,您不能真正从现有的 hdf5 文件中释放磁盘空间。它只是不是 hdf5 设计的一部分,因此它不是pytables 的一部分。您可以从文件中加载数据,然后将其全部重写为一个新文件(可能具有相同的名称),或者您可以使用命令行实用程序 h5repack 为您执行此操作。

    【讨论】:

    • PyTables 还附带了ptrepack 实用程序
    • h5repack -i original.hdf5 -o smaller.hdf5 效果很好,谢谢!
    猜你喜欢
    • 2019-02-11
    • 2016-11-22
    • 2016-11-12
    • 2011-12-21
    • 2015-10-10
    • 2014-09-20
    • 2011-05-20
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多