Зарр многопоточное чтение групп - PullRequest
0 голосов
/ 27 июня 2019

Не уверен, что этот вопрос имеет смысл / имеет отношение к 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 Ответ

1 голос
/ 05 июля 2019

Группы изначально предназначены для использования в качестве организационного контейнера. Группа может содержать любое количество массивов, где каждый массив может иметь различную форму и / или тип данных, поэтому они представляют собой гибкий способ организации данных. Если все ваши массивы имеют одинаковую форму и тип данных, вы можете, как вы предлагаете, объединить их все в один многомерный массив. Однако я не ожидал бы, что скорость чтения будет сильно отличаться, если у вас есть несколько массивов в группе или все данные в одном массиве, если общий объем данных одинаков.

Если вы хотите прочитать все массивы группы в память и используете компрессор по умолчанию (Blosc), то при декомпрессии он уже будет использовать несколько потоков. Blosc обычно делает хорошую работу по использованию доступных ядер, так что вы не сможете значительно улучшить, если вообще добавите дополнительную многопоточность.

...