问题标签 [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.
python - 来自 Xarray 的往返 Zarr 数据
使用xarray
,我ds.to_zarr()
用于将数据集写入 S3,然后xr.open_zarr()
查看是否得到相同的数据集。
我的数据集xarray
如下所示:
我把它写成zarr
使用:
当我尝试使用以下方法读回它时:
我回来了:
如果我设置,我可以读取数据集auto_chunk=False
:
结果是
但是我是否不了解有关分块和方式的一些知识xarray
,dask
并且zarr
应该一起工作?
为了上班,我必须做些什么不同的auto_chunk=True
事情?
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_mfdataset
和ds.to_zarr
.
我首先尝试重新chunks={'time':24, 'y':768, 'x':922}
分块以匹配 and 中的输入 NetCDF4 分块x
,y
但是当我尝试写信给 Zarr 时它抱怨,因为它需要在两者中统一块大小x
和y
,只允许沿维度的最后一个块中的大小不均匀time
(不幸的是在x
维度上,总大小 4608 不是块大小 922 的倍数。
所以然后我尝试chunks={'time':168, 'y':384, 'x':288}
并开始工作,并且非常快速地进行了几分钟,然后变得越来越慢。最终在 50 分钟后,集群死亡:
这是我正在使用的代码:
生产
然后我打电话
就在它死之前,Dask Daskboard 看起来像这样:
NetCDF4 文件的总大小为 20GB,因此在 Dask Dashboard 中显示超过 500GB 似乎有点疯狂,并且每个具有 60GB RAM 的 30 个处理器不足以完成这项工作。
我做错了什么,或者什么是更好的解决方案?
zarr - 单个阵列的多个压缩器
是否可以有不同的压缩器,例如单个块的有损和无损?
在一个场景中,您有一个重要的掩码,您希望通过无损压缩或什至不压缩来保留信号,但为了效率和空间而让信号的其他部分进行有损压缩。
例如我们有:
导入 zarr
z = zarr.zeros((32, 32), chunks=(4, 4))
我们想要保留的重要区域是A(4:11,4:11)
,我们想要无损的地方,例如zlib
,然后我们使用quantize
numcodecs 的其余部分进行有损。因此,我们将对掩码内的有趣部分进行高精度处理,并对掩码外的部分进行有损压缩,并在块级别为单个数组的不同部分设置两个不同的压缩器。
python - 如果并发读/写访问会发生什么?
在zarr 教程中是这样写的:
Zarr 阵列并不是为多个读取器和写入器同时在同一个阵列上操作的情况而设计的。
如果真的发生了会发生什么?它会崩溃吗?未定义的行为?它会只是缓慢或低效吗?
编辑:支持多个作者和多个读者:
数据源是指可能发生多个并发读取操作。数据接收器是指可能发生多个并发写入操作,每个写入器更新数组的不同区域
例子:
synchronizer = zarr.ProcessSynchronizer('data/example.sync')
z = zarr.open_array(..., synchronizer=synchronizer)
python - 访问 Zarr 中的一个块
Zarr以块的形式将数组保存在磁盘上,每个块都是一个单独的文件。有没有办法只访问一个选择的块(文件)?
如果不将整个数组加载到内存中,是否可以确定哪些块是空的?
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
,可能会进一步更改。
encoding - 如何使用整数 dtype 在 xarray / zarr 中编码 NaN 值?
我有一个包含 NaN 的大型 xarray DataArray 并想用 zarr 保存它。我想最小化文件大小,并且可以丢失一些精度 - 16 位应该可以。我尝试使用numcodecs.FixedScaleOffset(astype='u2')
过滤器,但这会将所有 NaN 存储为零。由于数据还包含零作为有效值,因此这不是很有帮助。
python - 块大小问题(Dask、xarray、zarr)
我想将 xarray.dataset 保存为 .zarr 文件,但我无法将我的块配置为统一的并且它不会保存。
我努力了:
使用 xarray.open_mfdataset 时更改块大小 -> 它仍然使用不起作用的自动块。
使用 dataset.chunk(n) 时更改块大小 -> 打开数据集时仍指自动块。
代码:
ValueError:Zarr 需要统一的块大小,最终块除外。可变 dask 块 ((1143410, 512447, 1170473, 281220, 852819),) 不兼容。考虑使用
chunk()
.
我希望 .zarr 文件与新块一起保存,但会引用原始自动块大小。
python - 如何创建 .mdb 文件?
我是 zarr、HDF5 和 LMDB 的新手。我已将数据从 HDF5 转换为 Zarr,但我得到了许多扩展名为 .n 的文件(n 从 0 到 31)。我只想拥有一个扩展名为 .zarr 的文件。我尝试使用 LMDB(zarr.LMDBStore 函数),但我不明白如何创建 .mdb 文件?你知道怎么做吗?谢谢 !