Быстрая нарезка файлов .h5 с помощью h5py

Я работаю с .h5 файлами с небольшим опытом.

В сценарии, который я написал, я загружаю данные из файла .h5. Форма результирующего массива: [3584, 3584, 75]. Здесь значения 3584 обозначают количество пикселей, а 75 обозначают количество временных кадров. Загрузка данных и печать формы занимает 180 мс. Я получаю это время, используя os.times().

Если я хочу просмотреть данные за определенный период времени, я использую следующий фрагмент кода:

data_1 = data[:, :, 1]

Нарезка занимает много времени (1,76 с). Я понимаю, что мой 2D-массив огромен, но в какой-то момент я хотел бы зациклиться на времени, которое займет очень много времени, поскольку я выполняю этот фрагмент в цикле for.

Есть ли более эффективный/менее трудоемкий способ разделения временных рамок или обработки данных такого типа?

Благодарю вас!


person The Dude    schedule 07.05.2014    source источник
comment
Действительно ли массив загружается за эти 180 мс, или это может быть просто объект, имитирующий массив, созданный поверх файла? Если 1 байт на пиксель, без сжатия, без накладных расходов, файл будет занимать почти 1 ГБ. Большинство SSD-дисков не достигают такой скорости, которая составляет около 5,4 ГБ/с. Другими словами, может ли операция нарезки также считывать файл?   -  person Lasse V. Karlsen    schedule 07.05.2014
comment
Хм, это хороший момент. Совсем забыл об этом.   -  person The Dude    schedule 09.05.2014


Ответы (1)


Примечание. Здесь я делаю предположения, поскольку не знаком с файлами .H5 и кодом Python, который обращается к ним.

Я думаю, что происходит то, что когда вы «загружаете» массив, вы на самом деле не загружаете массив. Вместо этого я думаю, что объект создается поверх файла. Вероятно, он считывает размеры и информацию, связанную с организацией файла, но не читает файл целиком.

Этот объект настолько хорошо имитирует массив, что когда вы позже выполняете операцию среза, может быть выполнена обычная операция среза Python, но в этот момент считываются фактические данные. Вот почему срез занимает так много времени по сравнению с «загрузкой» всех данных.

Я прихожу к такому выводу из-за следующего.

Если вы читаете 75 кадров размером 3584x3584 пикселей, я предполагаю, что они несжатые (H5, кажется, просто сырые дампы данных), и в этом случае 75 * 3,584 * 3,584 = 963,379,200, это около 918 МБ. данных. Соедините это с тем, что вы «читаете» это за 180 мс, мы получаем такой расчет:

918MB / 180ms = 5.1GB/second reading speed

Обратите внимание, это число относится к пикселям размером 1 байт, что также маловероятно.

Таким образом, такая скорость кажется маловероятной, поскольку даже самые лучшие твердотельные накопители сегодня достигают скорости менее 1 ГБ/с.

Кажется гораздо более правдоподобным, что объект просто создается поверх файла, а операция среза влечет за собой затраты на чтение как минимум 1 кадра данных.

Если мы разделим скорость на 75, чтобы получить скорость для каждого кадра, мы получим скорость 68 МБ/с для 1-байтовых пикселей, а с 24 или 32-битными пикселями мы получим скорость чтения до 270 МБ/с. Гораздо правдоподобнее.

person Lasse V. Karlsen    schedule 09.05.2014