Средство просмотра HDF5 для сжатых массивов LZF

Я использую h5py со сжатием LZF для хранения NumPy массивы в файлах HDF5.

Это работает хорошо, и мои сжатые файлы гораздо более переносимы, чем несжатые. Однако если я попытаюсь просмотреть сжатые файлы с помощью таких приложений, как vitables и HDFView, я получаю следующие ошибки:

"Ошибка: проблемы с чтением записей. Похоже, что набор данных сжат библиотекой None. Убедитесь, что она установлена ​​в вашей системе, пожалуйста" в vitables и

«ncsa.hdf.hdf5lib.exceptions.HDF5Exception: ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException: невозможно открыть каталог или файл» в HDFView.

Я могу просматривать файловые структуры в обоих приложениях, но при открытии массива возникает ошибка. Если я отключу сжатие, проблема исчезнет. Например, после запуска приведенного ниже кода открытие массива_1 приводит к ошибке, а массив_2 — нет.

import numpy as np, h5py

h5_path = r'D:\test.h5'

f = h5py.File(h5_path, 'w')

# Create fake data
data = (np.random.random(1E6)*100).astype(int)

# Save with compression
dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='lzf')

# Save without compression
dset2 = f.create_dataset(r'/path/to/arrays/array_2', data=data)

# Set some object properties
dset1.attrs['Description'] = 'Compressed array.'
dset2.attrs['Description'] = 'Uncompressed array.'

f.close()

Это ожидаемое поведение или я делаю что-то не так?

Если vitables и HDFView не могут открывать сжатые массивы, существует ли альтернативное средство просмотра, которое может?

Спасибо большое!


person JamesS    schedule 28.07.2014    source источник


Ответы (2)


Хотя h5py поставляется с LZF, сам HDF5 обычно не распространяется и не компилируется с LZF. Вместо этого вы можете использовать gzip, который включен во все версии HDF5 и поэтому может быть открыт в любой системе:

dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='gzip')

HDFView может открывать массивы, сжатые с помощью gzip.

Кроме того, если вы используете gzip, вы можете использовать compression_opts для установки уровня сжатия (целое число от 0 до 9):

dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='gzip', compression_opts=9)
person Yossarian    schedule 29.07.2014
comment
Отлично - использование gzip дает мне еще лучшую степень сжатия и, похоже, хорошо работает как с HDFView, так и с vitables. Спасибо большое! - person JamesS; 29.07.2014
comment
Эй, @Yossarian, знаете ли вы, что означает следующая ошибка при попытке просмотреть набор данных, сжатый gzip: IOError: Can't read data (Can't open directory)? - person Lilith-Elina; 10.10.2014
comment
@Lilith-Elina Лучше открыть новый вопрос, чем задавать в комментариях, вы можете включить больше информации. - person Yossarian; 10.10.2014
comment
Конечно, мне жаль. Только сейчас я понимаю, как много я не сказал... stackoverflow.com/questions/26301346/ - person Lilith-Elina; 10.10.2014

У меня была точно такая же проблема с наборами данных, хранящимися со сжатием LZF, и в итоге я нашел этот пост. С помощью HDFView мне удалось просмотреть наборы данных, сжатые с помощью GZIP с уровнем сжатия 9, т.е.:

dset = f.create_dataset('someData', data=data, compression="gzip", compression_opts=9)

Но все же я хотел увидеть сжатые наборы данных LZF. Существует графический интерфейс для файлов HDF5 с именем HDF Compass (репозиторий Github), разработанный среди прочих Эндрю Коллетт, хорошо известный в мире HDF. Когда был задан этот вопрос, разработка HDF Compass только начиналась. Сегодня я протестировал версию 0.6.0, и мне удалось правильно просмотреть сжатый файл LZF.

PD: Просто предупреждение: HDF Compass — это всего лишь инструмент только для чтения, в отличие от HDFView. Но тем не менее, это очень удобно и действительно быстро.

person iipr    schedule 05.04.2017