Определение массива dask из уже заблокированных данных в gcs - PullRequest
0 голосов
/ 19 января 2020

Я хочу создать массив 3d dask из данных, которые у меня есть, которые уже разделены на части. Мои данные состоят из 216 блоков, содержащих 1024x1024x1024 uint8 вокселей каждый, каждый из которых хранится в виде сжатого файла hdf5 с одним ключом, называемым data. Сжатый, мои данные только несколько мегабайт на блок, но распакованный, это занимает 1 ГБ на блок. Кроме того, мои данные в настоящее время хранятся в облачном хранилище Google (gcs), хотя я мог бы потенциально отразить их локально в контейнере.

Я подумал, что самым простым способом было бы использовать zarr, следуя этим инструкциям ( https://pangeo.io/data.html). Должен ли xarray распаковать мои данные перед сохранением в формате zarr? Придется ли перетасовывать данные и пытаться общаться между блоками? Есть ли более низкий уровень сборки zarr из блоков hdf5?

1 Ответ

1 голос
/ 19 января 2020

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

Вам не нужно ничего делать, чтобы просматривать ваши данные как единый массив dask, поскольку вы можете ссылаться на отдельные чанки как массивы (см. здесь ), а затем использовать функции стека / сцепления для создания единого массива. Это означает открытие каждого файла на клиенте, чтобы прочитать meatadata.

Аналогично, xarray имеет некоторые функции для чтения наборов файлов , где вы должны быть в состоянии предположить, что согласованность dtype и размерности - смотрите их документацию.

Что касается zarr, вы можете использовать dask для создания набора файлов для вас в GCS или нет, и выбрать ту же схему чанкинга, что и для вход - тогда не будет тасования. Так как zarr очень прост в настройке и понимании, вы даже можете создать набор данных zarr самостоятельно и записать куски один за другим, не создавая заранее массив dask из файлов zarr. Обычно это происходит через API zarr, и запись фрагмента данных не требует каких-либо изменений в файле метаданных, поэтому может выполняться параллельно. Теоретически, вы можете просто скопировать блок, если вы понимаете низкоуровневое представление данных (например, int64 в C -раскладке массива); однако я не знаю, насколько вероятно, что один и тот же механизм сжатия будет доступен как в исходном hdf, так и в zarr (см. здесь ).

...