Чтение файла hdf5 с использованием h5py со временем замедляется

У меня есть файл hdf5 размером 80000 * 401408. Мне нужно читать из него данные партиями по 64, но индексы могут быть случайными (5, 0, 121, .., 2).

Проблема заключается в том, что, хотя изначально чтение достаточно последовательное, и для завершения пакета требуется, скажем, 0,5 секунды, через некоторое время некоторые пакеты занимают больше времени, до 10 секунд, в то время как некоторые пакеты все еще читаются быстро. Я заметил, что по мере того, как происходит все больше и больше чтений, процесс чтения замедляется.

hf = h5py.File( conv_file,'r')
conv_features = hf['conv_features']
while True:
    conv_batch = [None for i in range(64)]
    for i in range(0, 64):
        conv_batch[count] = np.reshape(conv_features[some_random_index], [14, 14, 2048] )
    # time for each of the above reads for conv_bacth is different.. varies from 0.5 to 5 seconds.. and slows down over time.

Я не использую куски


person user3682478    schedule 02.10.2017    source источник
comment
Уверены, что у вас не заканчивается память и вы не начинаете работать над устройством подкачки или что-то в этом роде?   -  person Stefan Falk    schedule 03.10.2017
comment
Нет, у меня не заканчивается память. Просто со временем процесс замедляется. Я повторно использую одни и те же переменные и только один раз читаю ссылку на файл hdf5.   -  person user3682478    schedule 03.10.2017
comment
Не совсем уверен, можно ли определить проблему из примера, который вы там показываете. Я также не уверен, почему вы используете здесь тег deep-learning. Возможно, опубликуйте свой реальный код, а не только этот небольшой отрывок.   -  person Stefan Falk    schedule 03.10.2017
comment
displayname верно, трудно диагностировать эту проблему, если у нас недостаточно информации для ее воспроизведения.   -  person Paulo Scardine    schedule 03.10.2017
comment
Я хотел знать, обычно ли для hdf5 чтение с переменным временем (из-за случайного доступа к индексам). Время чтения 64 векторов составляет от 0,5 до 5 секунд, и, как я уже упоминал, со временем оно замедляется. Помимо вышеперечисленного, очень мало что имеет отношение к hdf5.   -  person user3682478    schedule 03.10.2017
comment
Библиотека HDF5 кэширует метаданные и данные об открытых файлах HDF5. Вы пытались закрыть/открыть файл для каждого доступа? Этот подход стоит рассчитать по времени.   -  person Pierre de Buyl    schedule 03.10.2017
comment
h5py 'fancy-indexing' предупреждает, что производительность индексации может быть низкой. docs.h5py.org/en/latest/high/dataset. html#fancy-indexing. Помните, что файл на диске по своей сути является последовательным устройством, поэтому чтение из двух далеко разделенных «строк» ​​требует больших файловых seek перемещений.   -  person hpaulj    schedule 03.10.2017
comment
Файл сжат?   -  person kakk11    schedule 03.10.2017
comment
@ kakk11 Нет, файл не сжат.   -  person user3682478    schedule 04.10.2017
comment
@hpaulj Понятно. Данные находятся на SSD, так что это не должно быть большой проблемой. Меня больше беспокоит, почему в некоторых случаях произвольный доступ работает быстрее, чем в других.   -  person user3682478    schedule 04.10.2017
comment
@PierredeBuyl Спасибо за предложение! Я попробую это и дам вам знать, если это сработало.   -  person user3682478    schedule 04.10.2017
comment
Я попробовал это с меньшим набором данных (3000,401408) и не смог воспроизвести вашу проблему (Win64, Python 2.7, новейшая доступная версия h5py, доступная в Anaconda). Скорость чтения в начале примерно равна скорости последовательного чтения моего SSD и становится быстрее, потому что некоторые данные сохраняются в оперативной памяти. Не могли бы вы предоставить дополнительную информацию (версия Python, версия h5py, операционная система)?   -  person max9111    schedule 09.10.2017


Ответы (1)


Вы пытались контролировать размер фрагмента с помощью набора данных. Установите размер фрагмента на разумную и общедоступную часть.

например, если вы обычно обращаетесь к своим 80000 * 401408 данным на строку, куски будут эффективно считываться, если куски были (1, 401408) или, возможно, (1, 200704).

В зависимости от вашего шаблона доступа размер фрагмента может сильно повлиять на время, необходимое для доступа. Вы также можете рассмотреть возможность использования сжатия.

person Marcus Lim    schedule 30.09.2018