Публичный аккаунт WeChat: пространство для измерений
1. Что такое Зарр?
ZarrОфициальный веб-сайт описывает Zarr как пакет Python, который предоставляет функции фрагментированного, сжатого N-мерного массива.ChunkedУказывает, что Zarr может обрабатывать очень большие наборы данных и быстрый доступ к данным.compressedЭто означает, что Zarr может использовать файлы разумного размера для сохранения файлов, что также означает более низкие затраты.N-мерный массивФункциональное описание Zarr может обрабатывать многомерные наборы данных, такие как Netcdf, например, наборы геолого-геофизических данных с четырьмя измерениями времени, x, y и z.
Некоторые основные моменты Zarr заключаются в следующем:
- N-мерные массивы можно создавать с помощью NumPy.
- Массив блоков по любому измерению.
- Сжимайте и/или фильтруйте массивы блоков, используя любой кодек NumCodecs.
- Храните массивы в памяти, на диске, в Zip-файлах, в облачном хранилище (например, AWS S3),...
- Массивы считываются одновременно из нескольких потоков или процессов.
- Параллельная запись в массив из нескольких потоков или процессов.
- Организуйте массивы в иерархии с помощью групп.
Наиболее важным компонентом Zarr является то, что он позволяет читать и записывать файлы в облачные системы хранения (такие как AWS S3) точно так же, как ваша локальная файловая система, но поддерживает формат организации данных Netcdf.
2. Прочитайте файл netcdf
Здесь мы будем использоватьNCEP Reanalysis DatasetНапример, данные о температуре приземного воздуха. Сначала я поместил файл температуры приземного воздуха за 2019 год.air.sig995.2019.nc
Загрузите на свой локальный компьютер. Затем используйтеxarrayПрочитайте данные в файле.
import xarray as xr
ds = xr.open_dataset('air.sig995.2019.nc')
ds
<xarray.Dataset>
Dimensions: (lat: 73, lon: 144, nbnds: 2, time: 116)
Coordinates:
* lat (lat) float32 90.0 87.5 85.0 82.5 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* time (time) datetime64[ns] 2019-01-01 2019-01-02 ... 2019-04-26
Dimensions without coordinates: nbnds
Data variables:
air (time, lat, lon) float32 ...
time_bnds (time, nbnds) float64 ...
Attributes:
Conventions: COARDS
title: mean daily NMC reanalysis (2014)
history: created 2017/12 by Hoop (netCDF2.3)
description: Data is from NMC initialized reanalysis\n(4x/day). These...
platform: Model
References: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reana...
dataset_title: NCEP-NCAR Reanalysis 1
ds.air
<xarray.DataArray 'air' (time: 116, lat: 73, lon: 144)>
[1219392 values with dtype=float32]
Coordinates:
* lat (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* time (time) datetime64[ns] 2019-01-01 2019-01-02 ... 2019-04-26
Attributes:
long_name: mean Daily Air temperature at sigma level 995
units: degK
precision: 2
GRIB_id: 11
GRIB_name: TMP
var_desc: Air temperature
dataset: NCEP Reanalysis Daily Averages
level_desc: Surface
statistic: Mean
parent_stat: Individual Obs
valid_range: [185.16 331.16]
actual_range: [198.4 314. ]
Из приведенных выше результатов мы видим, чтоair
Переменной является среднесуточная температура в градусах К. Эта переменная имеет три измерения: время, долгота (lon) и широта (lat).
3. Сохраните данные в формате Zarr
Теперь мы сохраним вышеуказанные данные в формате Zarr. Поскольку у меня нет учетной записи AWS, я собираюсь сохранить ее на своем ноутбуке. Обратите внимание: если у вас есть учетная запись AWS, вы можетеs3fsСохраните его прямо в AWS S3 с помощью пакета. s3fs — это файловый интерфейс Python для S3, построенный наboto3выше,boto3— это SDK Amazon Web Services (AWS) для Python.
import zarr
import s3fs
# Compare the data if needed
compressor = zarr.Blosc(cname='zstd', clevel=3)
encoding = {vname: {'compressor': compressor} for vname in ds.data_vars}
# Save to zarr
ds.to_zarr(store='zarr_example', encoding=encoding, consolidated=True)
<xarray.backends.zarr.ZarrStore at 0x31a4d1ef0>
Теперь мы сохранили данные как локальный файл zarr.
Следующий код можно использовать для сохранения данных в формате zarr AWS S3.
import zarr
import s3fs
# AWS S3 path
s3_path = 's3://your_data_path/zarr_example'
# Initilize the S3 file system
s3 = s3fs.S3FileSystem()
store = s3fs.S3Map(root=s3_path, s3=s3, check=False)
# Compare the data if needed
compressor = zarr.Blosc(cname='zstd', clelve=3)
encoding = {vname: {'compressor': compressor} for vname in ds.data_vars}
# Save to zarr
ds.to_zarr(store=store, encoding=encoding, consolidated=True)
4. Прочитайте файл Zarr
Чтение файлов Zarr также легко. Вы можете считывать файлы zarr непосредственно из облачных систем хранения, таких как AWS S3, что особенно важно для геолого-геофизических данных. С Zarr мы можем напрямую получить доступ ко всему набору данных или его части. Представьте себе, что все данные погодно-климатических моделей и спутников (например, данные реанализа NCEP) хранятся в облачном хранилище (это могут быть тысячи терабайт или петабайт), которые мы можем легко прочитать прямо из AWS S3 с помощью нескольких строк кода и загрузить файлы. без необходимости постоянно управлять этими болезненными и трудоемкими процессами загрузки данных. Как бы прекрасна была наша жизнь!
Поскольку у меня нет учетной записи AWS S3, в качестве примера я буду использовать локальный файл zarr.
# Read Zarr file
zarr_ds = xr.open_zarr(store='zarr_example', consolidated=True)
zarr_ds
<xarray.Dataset>
Dimensions: (lat: 73, lon: 144, nbnds: 2, time: 116)
Coordinates:
* lat (lat) float32 90.0 87.5 85.0 82.5 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* time (time) datetime64[ns] 2019-01-01 2019-01-02 ... 2019-04-26
Dimensions without coordinates: nbnds
Data variables:
air (time, lat, lon) float32 dask.array<shape=(116, 73, 144), chunksize=(58, 37, 72)>
time_bnds (time, nbnds) float64 dask.array<shape=(116, 2), chunksize=(116, 2)>
Attributes:
Conventions: COARDS
References: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reana...
dataset_title: NCEP-NCAR Reanalysis 1
description: Data is from NMC initialized reanalysis\n(4x/day). These...
history: created 2017/12 by Hoop (netCDF2.3)
platform: Model
title: mean daily NMC reanalysis (2014)
Просто, правда?На самом деле здесь zarr читает только метаданные файла данных вместо того, чтобы загружать все реальные данные. Эта функция очень полезна, когда объем данных велик. Потому что обычно мы используем не все данные, а только часть набора данных. Например, мы могли бы просто прочитать данные о температуре за январь 2019 года.
import pandas as pd
# We'd like the read data in Januray 2019
time_period = pd.date_range('2019-01-01', '2019-01-31')
# Select part of the zarr data
zarr_Jan = zarr_ds.sel(time=time_period)
zarr_Jan
<xarray.Dataset>
Dimensions: (lat: 73, lon: 144, nbnds: 2, time: 31)
Coordinates:
* lat (lat) float32 90.0 87.5 85.0 82.5 ... -82.5 -85.0 -87.5 -90.0
* lon (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* time (time) datetime64[ns] 2019-01-01 2019-01-02 ... 2019-01-31
Dimensions without coordinates: nbnds
Data variables:
air (time, lat, lon) float32 dask.array<shape=(31, 73, 144), chunksize=(31, 37, 72)>
time_bnds (time, nbnds) float64 dask.array<shape=(31, 2), chunksize=(31, 2)>
Attributes:
Conventions: COARDS
References: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reana...
dataset_title: NCEP-NCAR Reanalysis 1
description: Data is from NMC initialized reanalysis\n(4x/day). These...
history: created 2017/12 by Hoop (netCDF2.3)
platform: Model
title: mean daily NMC reanalysis (2014)
Выше мы выбрали данные только за январь 2019 года. Простой не так ли?
Следующий код можно использовать для доступа к файлу zarr AWS S3.
# AWS S3 path
s3_path = 's3://your_data_path/zarr_example'
# Initilize the S3 file system
s3 = s3fs.S3FileSystem()
sotre = s3fs.S3Map(root=s3_path, s3=s3, check=False)
# Read Zarr file
ds = xr.open_zarr(store=store, consolidated=True)
5. Секрет быстрого доступа: "consolidated = True"
Как только данные zarr будут исправлены и их можно будет рассматривать как доступные только для чтения, мы можем передать параметрconsolidated = True
Объедините множество объектов метаданных в один объект. Это может значительно повысить скорость чтения метаданных набора данных, делая чтение данных очень быстрым!
6. Резюме
С Zarr мы можем легко читать и записывать файлы в облачные системы хранения (например, AWS S3), что очень полезно для хранения и доступа к большим данным с использованием облачных систем хранения. ЗаррcompressedиconsolidatedФункции также могут помочь нам сократить расходы на хранение и ускорить доступ к данным. Чтение и запись N-мерных данных в облаке — очень горячая тема. В дополнение к Zarr теперь есть несколько других пакетов. Однако пока Zarr является лидером в этом отношении.