Зарр многопоточное чтение групп
Не уверен, что этот вопрос имеет смысл / имеет отношение к zarr. Я храню данные Zarr на диске в группах, так, например, у меня есть
group = zarr.group()
d1 = group.create_dataset('baz', shape=100, chunks=10)
d2 = group.create_dataset('foo', shape=100, chunks=10)
Теперь группа итеративна, поэтому я могу перебирать ее и читать данные из всех групп:
all_data = [group[g][:] for g in group]
Есть ли способ прочитать все данные из групп, используя многопоточность, чтобы ускорить его? Я знаю, что в массиве вы можете использовать многопоточность для чтения и записи данных.
Предполагая, что чтение данных по группам является слишком медленным для меня, я должен поместить все группы в один контейнер массива данных? Я думаю, мне интересно, какова функция групп, кроме организационного контейнера. Потому что, предполагая, что каждая группа содержит одинаковые данные, вы теоретически можете просто добавить еще одну ось в свой массив (для групп) и сохранить все группы в одном большом массиве.
1 ответ
Группы изначально предназначены для использования в качестве организационного контейнера. Группа может содержать любое количество массивов, где каждый массив может иметь различную форму и / или тип данных, поэтому они представляют собой гибкий способ организации данных. Если все ваши массивы имеют одинаковую форму и тип данных, вы можете, как вы предлагаете, объединить их все в один многомерный массив. Однако я не ожидал бы, что скорость чтения будет очень разной, если у вас есть несколько массивов в группе или все данные в одном массиве, если общий объем данных одинаков.
Если вы хотите прочитать все массивы группы в память и используете компрессор по умолчанию (Blosc), то при декомпрессии он уже будет использовать несколько потоков. Blosc обычно делает хорошую работу по использованию доступных ядер, так что вы не сможете значительно улучшить, если вообще добавите дополнительную многопоточность.