2017-01-25 4 views
2

У меня небольшая проблема с пакетом h5py от python. Я работаю с очень большими наборами данных (размером около 250 тыс. Фрагментов изображения), хранящимися в файле hdf5, в виде массива с размерами (num_images x color_channels x width x height)Увеличение скорости чтения для h5py

Этот набор данных случайным образом разделяется на обучение и проверку данные. Следовательно, мне нужно считывать случайные элементы этих данных при обучении моего классификатора.

Я сделал для меня странное открытие, что загрузка всего набора данных (все 250 тыс. Изображений) намного быстрее, чем чтение определенного подмножества этих данных. В частности, чтение всего массива как:

data = h5py.File("filename.h5", "r")["images"][:] 

быстрее примерно на коэффициент 5, чем если бы я считанный только случайное, непоследовательное подмножество этих изображений (25k изображений):

indices = [3, 23, 31, 105, 106, 674, ...] 
data = h5py.File("filename.h5", "r")["images"][indices, :, :, :] 

Это по дизайну? Это связано с сжатием файла hdf5?

ответ

3

http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing

Подмножество синтаксиса фантазии индексации NumPy поддерживается. Используйте это с осторожностью, так как основные механизмы HDF5 могут иметь разную производительность, чем вы ожидаете.

Очень длинные списки (> 1000 элементов) может привести к снижению производительности

Advanced индексацию требует считывание блока данных здесь, а затем пропуская некоторое расстояние и чтение другого и так далее. Если эти данные все в памяти, как в буфере данных ndarray, это можно сделать относительно быстро, хотя и медленнее, чем чтение того же количества байтов в одном смежном блоке. Когда эти данные находятся в файле, вам необходимо включить поиск файлов и чтение блоков.

Кроме того, если вы используете комков и сжатия:

Chunking влияет на производительность. Рекомендуется хранить общий размер ваших кусков между 10 KiB и 1 MiB, больше для больших наборов данных. Также имейте в виду, что, когда доступ к любому элементу в куске, весь фрагмент считывается с диска.

Интересно, если сохранение изображений в качестве отдельных наборов данных улучшит производительность. Затем вы извлекали их по имени, а не по индексу 1-го измерения. Вам придется присоединиться к ним в 4d-массиве, но я подозреваю, что h5py должен делать это в любом случае (он будет читать их отдельно).

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