我有一個HDF5文件,其中包含一個非常大的EARRAY,我想截斷它以節省磁盤空間並更快地處理它。我在包含EARRAY的節點上使用truncate
方法。 pytables報告數組已被截斷,但仍佔用磁盤上相同的空間。如何使用pytables截斷HDF5文件中的EARRAY?
目錄列表截斷前:
$ 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
我在做什麼錯?我怎樣才能回收這個磁盤空間?
如果有一種方法可以直接修改耳膜的內容,而不是使用truncate方法,這對我來說會更有用。像node = node [idx1:idx2,:],這樣我就可以選擇我想保留的數據塊。但是當我使用這種語法時,變量node
只是變成了一個numpy數組,而hdf5文件沒有被修改。
PyTables還附帶了['ptrepack'](http://www.pytables.org/usersguide/utilities.html#ptrepack)此工具 –
'h5repack -i original.hdf5 -o smaller.hdf5'工程精美,謝謝! – cxrodgers