2015-08-27 2 views
0

У меня есть файл HDF5, содержащий очень большой EARRAY, который я бы хотел урезать, чтобы сэкономить дисковое пространство и обработать его быстрее. Я использую метод truncate на узле, содержащем EARRAY. pytables сообщает, что массив был усечен, но на диске все еще занимает такое же пространство.Как обрезать EARRAY в файле HDF5 с помощью 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 

Что я делаю неправильно? Как я могу восстановить это дисковое пространство?

Если бы был способ прямого изменения содержимого почтового ящика, вместо использования метода 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 less.hdf5' works красиво, спасибо! – cxrodgers

Смежные вопросы