问题标签 [zarr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
534 浏览

python - 来自 Xarray 的往返 Zarr 数据

使用xarray,我ds.to_zarr()用于将数据集写入 S3,然后xr.open_zarr()查看是否得到相同的数据集。

我的数据集xarray如下所示:

我把它写成zarr使用:

当我尝试使用以下方法读回它时:

我回来了:

如果我设置,我可以读取数据集auto_chunk=False

结果是

但是我是否不了解有关分块和方式的一些知识xarraydask并且zarr应该一起工作?

为了上班,我必须做些什么不同的auto_chunk=True事情?

0 投票
1 回答
1411 浏览

python - 如何最好地将 NetCDF 文件集合重新分块到 Zarr 数据集

我正在尝试重新分块 NetCDF 文件集合并在 AWS S3 上创建一个 Zarr 数据集。我有 168 个原始 NetCDF4 经典文件,其维度数组time: 1, y: 3840, x: 4608分块为chunks={'time':1, 'y':768, 'x':922}.

我想将此输出写入 Zarr,并且我想优化时间序列提取,因此在我的块中包含更多时间记录。我想我会使用 xarray 来帮助完成工作,因为我有很多处理器可以利用 Dask,而 xarray 同时具有xr.open_mfdatasetds.to_zarr.

我首先尝试重新chunks={'time':24, 'y':768, 'x':922}分块以匹配 and 中的输入 NetCDF4 分块xy但是当我尝试写信给 Zarr 时它抱怨,因为它需要在两者中统一块大小xy,只允许沿维度的最后一个块中的大小不均匀time(不幸的是在x维度上,总大小 4608 不是块大小 922 的倍数。

所以然后我尝试chunks={'time':168, 'y':384, 'x':288}并开始工作,并且非常快速地进行了几分钟,然后变得越来越慢。最终在 50 分钟后,集群死亡:

这是我正在使用的代码:

在此处输入图像描述

生产

然后我打电话

就在它死之前,Dask Daskboard 看起来像这样:

在此处输入图像描述 在此处输入图像描述

NetCDF4 文件的总大小为 20GB,因此在 Dask Dashboard 中显示超过 500GB 似乎有点疯狂,并且每个具有 60GB RAM 的 30 个处理器不足以完成这项工作。

我做错了什么,或者什么是更好的解决方案?

0 投票
1 回答
31 浏览

zarr - 单个阵列的多个压缩器

是否可以有不同的压缩器,例如单个块的有损和无损?

在一个场景中,您有一个重要的掩码,您希望通过无损压缩或什至不压缩来保留信号,但为了效率和空间而让信号的其他部分进行有损压缩。

例如我们有:

导入 zarr
z = zarr.zeros((32, 32), chunks=(4, 4))

我们想要保留的重要区域是A(4:11,4:11),我们想要无损的地方,例如zlib,然后我们使用quantizenumcodecs 的其余部分进行有损。因此,我们将对掩码内的有趣部分进行高精度处理,并对掩码外的部分进行有损压缩,并在块级别为单个数组的不同部分设置两个不同的压缩器。

0 投票
1 回答
181 浏览

python - 如果并发读/写访问会发生什么?

zarr 教程中是这样写的:

Zarr 阵列并不是为多个读取器和写入器同时在同一个阵列上操作的情况而设计的。

如果真的发生了会发生什么?它会崩溃吗?未定义的行为?它会只是缓慢或低效吗?

编辑:支持多个作者和多个读者:

数据源是指可能发生多个并发读取操作。数据接收器是指可能发生多个并发写入操作,每个写入器更新数组的不同区域

例子:

synchronizer = zarr.ProcessSynchronizer('data/example.sync') z = zarr.open_array(..., synchronizer=synchronizer)

0 投票
2 回答
238 浏览

python - 访问 Zarr 中的一个块

Zarr以块的形式将数组保存在磁盘上,每个块都是一个单独的文件。有没有办法只访问一个选择的块(文件)?

如果不将整个数组加载到内存中,是否可以确定哪些块是空的?

0 投票
2 回答
378 浏览

python - 将压缩数组完全从磁盘加载到内存中的智能方法是什么 - 也(同样)压缩?

我正在尝试存储在磁盘上的 3 维 zarr 数组:

据我了解,zarr-arrays 也可以驻留在内存中 - 压缩,就好像它们在磁盘上一样。所以我想为什么不尝试将整个东西加载到具有 32 GB 内存的机器上的 RAM 中。压缩后,数据集将需要大约50% 的 RAM。未压缩时,它需要的 RAM 大约是可用 RAM 的 6 倍。

准备:

以下实验几乎立即失败并出现内存不足错误:

据我了解,disk_array[:, :, :]将尝试创建一个未压缩的全尺寸 numpy 数组,这显然会失败。

第二次尝试,有效但速度非常慢:

在这里,我试图一次读取一定数量的块并将它们放入我的内存数组中。它可以工作,但它比最初将这个东西写入磁盘所用的速度要慢 6 到 7 倍。编辑:是的,它仍然很慢,但是由于磁盘问题发生了 6 到 7 次。

实现这一目标的智能且快速的方法是什么?我猜,除了没有使用正确的方法之外,我的块也可能太小了——但我不确定。

编辑:磁盘阵列和内存阵列的形状、块大小和压缩应该是相同的。因此,在我上面的示例中应该可以消除解压缩过程。

我找到了,zarr.convenience.copy但它被标记为experimental feature,可能会进一步更改。


GitHub 上的相关问题

0 投票
2 回答
315 浏览

encoding - 如何使用整数 dtype 在 xarray / zarr 中编码 NaN 值?

我有一个包含 NaN 的大型 xarray DataArray 并想用 zarr 保存它。我想最小化文件大小,并且可以丢失一些精度 - 16 位应该可以。我尝试使用numcodecs.FixedScaleOffset(astype='u2')过滤器,但这会将所有 NaN 存储为零。由于数据还包含零作为有效值,因此这不是很有帮助。

0 投票
1 回答
229 浏览

python - zarr 生成多少文件?

我正在寻找一种线程安全的替代 hdf5 的替代品,以便在多处理环境中读取并偶然发现zarr,根据基准,据说它基本上是 python 环境中 h5py 的直接替代品。

我试过了,到目前为止一切都很好,但我无法理解 zarr 输出的文件数量。

如果我使用 h5py 写入 h5 文件,则只有一个文件结果,而zarr似乎在子文件夹中输出随机数量的文件。

有人会向我解释为什么会这样以及创建文件的确切数量取决于什么?

提前致谢

0 投票
1 回答
950 浏览

python - 块大小问题(Dask、xarray、zarr)

我想将 xarray.dataset 保存为 .zarr 文件,但我无法将我的块配置为统一的并且它不会保存。

我努力了:

使用 xarray.open_mfdataset 时更改块大小 -> 它仍然使用不起作用的自动块。

使用 dataset.chunk(n) 时更改块大小 -> 打开数据集时仍指自动块。

代码:

ValueError:Zarr 需要统一的块大小,最终块除外。可变 dask 块 ((1143410, 512447, 1170473, 281220, 852819),) 不兼容。考虑使用chunk().

我希望 .zarr 文件与新块一起保存,但会引用原始自动块大小。

0 投票
2 回答
154 浏览

python - 如何创建 .mdb 文件?

我是 zarr、HDF5 和 LMDB 的新手。我已将数据从 HDF5 转换为 Zarr,但我得到了许多扩展名为 .n 的文件(n 从 0 到 31)。我只想拥有一个扩展名为 .zarr 的文件。我尝试使用 LMDB(zarr.LMDBStore 函数),但我不明白如何创建 .mdb 文件?你知道怎么做吗?谢谢 !