Zarr:提高对 S3 的 xarray 写入性能

问题描述

xarray 数据集写入 AWS S3 需要花费惊人的大量时间,即使实际上没有使用 compute=False 写入数据也是如此。

这是一个例子:

import fsspec
import xarray as xr

x = xr.tutorial.open_dataset("rasm")
target = fsspec.get_mapper("s3://bucket/target.zarr")
task = x.to_zarr(target,compute=False)

即使没有实际计算,to_zarr 也需要大约 6 秒从与 S3 存储桶位于同一区域的 EC2 中花费大约 6 秒

查看调试日志,似乎有相当多的重定向正在进行,因为 aiobotocore 中的认区域设置为 us-east-2,而存储桶位于 eu-central-1 中。

如果我先手动将认区域放入环境变量中

os.environ['AWS_DEFAULT_REGION'] = 'eu-central-1'

然后所需的时间下降到大约 3.5 秒

所以我的问题是:

  1. 有什么办法可以将区域传递给fsspec(或s3fs)?我曾尝试将 s3_additional_kwargs={"region":"eu-central-1"} 添加get_mapper 方法,但没有任何作用。


版本:

xarray

解决方法

在检查他们的文档时,对于 s3fs documentation,他们将 region_name 显示为 kwargs 以及有关使用 region 的 fsspec 问题

因此您可以在 client_kwargs={'region_name':'eu-central-1'} 中使用类似 get_mapper 的内容,例如:

fsspec.get_mapper("s3://bucket/target.zarr",client_kwargs={'region_name':'eu-central-1'})

此外,zarr 因庞大的数据集而广受欢迎。