2015-08-27 30 views
0

我有一個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文件沒有被修改。

回答

3

正如在this question中所討論的那樣,您無法真正地從現有的hdf5文件釋放磁盤空間。這不是hdf5設計的一部分,因此它不是pytables的一部分。您可以從文件加載數據,然後將其全部重寫爲新文件(可能具有相同的名稱),也可以使用命令行實用程序h5repack爲您完成此操作。

+3

PyTables還附帶了['ptrepack'](http://www.pytables.org/usersguide/utilities.html#ptrepack)此工具 –

+1

'h5repack -i original.hdf5 -o smaller.hdf5'工程精美,謝謝! – cxrodgers