У меня есть файл 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 не изменяется.
PyTables также поставляется с утилитой ['ptrepack'] (http://www.pytables.org/usersguide/utilities.html#ptrepack) для этого –
' h5repack -i original.hdf5 -o less.hdf5' works красиво, спасибо! – cxrodgers