如何高效地将 npy 转换为 xarray / zarr

2023-11-29

我有一个 37 GB 的 .npy 文件,我想将其转换为 Zarr 存储,以便可以包含坐标标签。理论上我有代码可以做到这一点,但我总是内存不足。我想在中间使用 Dask 来促进分块执行此操作,但我仍然耗尽内存。

这些数据是人们股骨软骨的“厚度图”。每个地图都是一个 310x310 浮点数组,共有 47789 个这样的地图。所以数据形状是(47789,310,310)。

步骤 1:将 npy 文件加载为内存映射的 Dask 数组。

fem_dask = dask.array.from_array(np.load('/Volumes/T7/cartilagenpy20220602/femoral.npy', mmap_mode='r'),
                                 chunks=(300, -1, -1))

步骤 2:在 Dask 数组上创建一个 xarray DataArray,并使用所需的坐标。我有几个来自“地图”维度的坐标metadata(熊猫数据框)。

fem_xr = xr.DataArray(fem_dask, dims=['map','x','y'],
                         coords={'patient_id': ('map', metadata['patient_id']),
                                 'side':       ('map', metadata['side'].astype(np.string_)),
                                 'timepoint':  ('map', metadata['timepoint'])
                                })

enter image description here

第三步:写信给扎尔。

fem_ds = fem_xr.to_dataset(name='femoral')  # Zarr requires Dataset, not DataArray
res = fem_ds.to_zarr('/Volumes/T7/femoral.zarr', 
                     encoding={'femoral': {'dtype': 'float32'}},
                     compute=False)
res.visualize()

See task graph below if desired enter image description here

当我打电话时res.compute(),RAM 使用很快就会失控。其他 python 进程(我认为是 Dask 工作进程)似乎处于不活动状态:

enter image description here

But a bit later, they are active -- see that one of those Python processes now has 20 gb RAM and another has 36 gb: enter image description here

我们还可以从 Dask 仪表板确认这一点:

enter image description here

最终所有的工人都被杀了,任务也出错了。我怎样才能以有效的方式正确使用 Dask、xarray 和 Zarr,而不耗尽 RAM(或熔化笔记本电脑)?


使用线程

如果 dask 工作人员可以共享线程,那么您的代码应该可以正常工作。如果您没有显式初始化 dask 集群,dask.Array 将使用默认参数创建一个使用进程的集群。这会导致您所看到的行为。要解决此问题,请使用线程显式创建集群:

# use threads, not processes
cluster = dask.distributed.LocalCluster(processes=False)
client = dask.distributed.Client(cluster)

arr = np.load('myarr.npy', mmap_mode='r')
da = dda.from_array(arr).rechunk(chunks=(100, 310, 310))
da.to_zarr('myarr.zarr', mode='w')

使用进程或分布式工作人员

如果您使用的集群无法共享线程,例如 JobQueue、KubernetesCluster 等,则可以使用以下命令来读取 npy 文件,假设它位于网络文件系统上或以某种方式可供所有工作人员使用。

这是一个工作流程,从内存映射创建一个空数组,然后使用映射读取作业dask.array.map_blocks。关键是使用block_info可选关键字,它提供有关数组中块的位置的信息,我们可以使用 dask 工作程序来切片新的 mmap 数组对象:

def load_npy_chunk(da, fp, block_info=None, mmap_mode='r'):
    """Load a slice of the .npy array, making use of the block_info kwarg"""
    np_mmap = np.load(fp, mmap_mode=mmap_mode)
    array_location = block_info[0]['array-location']
    dim_slicer = tuple(list(map(lambda x: slice(*x), array_location)))
    return np_mmap[dim_slicer]

def dask_read_npy(fp, chunks=None, mmap_mode='r'):
    """Read metadata by opening the mmap, then send the read job to workers"""
    np_mmap = np.load(fp, mmap_mode=mmap_mode)
    da = dda.empty_like(np_mmap, chunks=chunks)
    return da.map_blocks(load_npy_chunk, fp=fp, mmap_mode=mmap_mode, meta=da)

这对我来说适用于相同大小的演示(您可以在最后添加 xarray.DataArray 创建/格式化步骤,但 dask 操作工作正常,并且工作内存对我来说保持在 1GB 以下):

import numpy as np, dask.array as dda, xarray as xr, pandas as pd, dask.distributed

### insert/import above functions here

# save a large numpy array
np.save('myarr.npy', np.empty(shape=(47789, 310, 310), dtype=np.float32))

cluster = dask.distributed.LocalCluster()
client = dask.distributed.Client(cluster)

da = dask_read_npy('myarr.npy', chunks=(300, -1, -1), mmap_mode='r')
da.to_zarr('myarr.zarr', mode='w')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何高效地将 npy 转换为 xarray / zarr 的相关文章

随机推荐

  • 返回之前的 JPanel

    我继承了代码 并且由于需要长时间解释的原因 我需要使用空布局 我一直在尝试利用他们在 JPanels 之间导航的内容 我一直不知道怎么做 这就是我现在所拥有的 它被编译成下面的 SSCCE 我试图做的是将 JPanel 添加到 ArrayL
  • 多类分类中负例的经验法则

    在多类分类任务中 对于表示 其他所有内容 的标签 样本数量应该有多大 是否有一个经验法则 示例 我想将我的输入分类为以下之一X类 这X 1当输入为 以上都不是 时 类将激活 假设我的数据集包含 10 个 正 类别中每个类别的 5 000 个
  • 将 KML 文件读入 R

    我正在构建一个工作流程 用于将多几何 KML 文件读取到 R 中 这是我的工作地图 具有点和路径几何形状 可重现的 R 脚本是 library rgdal setwd SPECIFY A FOLDER download file http
  • 在Python中删除字符

    有人知道如何删除特定字符后面的所有字符吗 像这样 http google com translate t into http google com 如果您询问的是抽象字符串而不是网址 您可以使用 gt gt gt astring http
  • 为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

    这个问题在这里已经有答案了 无法找出合适的标题 我不明白 dash bash 中的行为 也就是说 我使用 set e 在命令失败时进行救援 并使用命令组来处理积极结果 IE 总体方案是 wantcommand command Than 意味
  • 如何在 Windows Phone 项目中导入 C++ dll

    我用 C 创建了一个 DLL 文件 我想将其导入到我的 Windows Phone 项目中 我遵循了来自不同来源的许多说明 即使当我运行我的代码时 我也会收到以下错误 尝试访问该方法失败 rough MainPage Add System
  • python openpyxl读取excel太慢

    我有一个 xlsx 文件 拥有 1841 行 每行有 30 列 使用 openpyxl 将整个信息保存到列表中 def get value i ws article row value ws cell row article row col
  • 是否有可能在 python 中找到 [a,b] 范围内的随机浮点数?

    我试图在 python 中生成 0 8 0 9 范围内的随机浮点数 但不幸的是 我发现的所有工具只能生成 a b 范围内的浮点数随机数 喜欢Random uniform a b 与此同时 我尝试做这样的事情 uniform 0 8 0 90
  • TypeScript 类型特定字符的字符串

    假设我想允许使用十六进制字符串 所以唯一允许的值为 0 9a f TypeScript 有没有办法定义只接受某些字符串的类型字符串 IE valid const valid HexString 123abc invalid const in
  • System.DateTime.Now 和 System.DateTime.Today 之间的区别

    谁能解释一下两者之间的区别System DateTime Now and System DateTime Today在 C NET 中 如果可能的话 各有利弊 DateTime Now返回一个DateTime由运行代码的计算机的本地日期和时
  • Google Apps 脚本 - MailApp

    我想使用 Google Apps 脚本发送一封带有replyTo 和附件的电子邮件 但我只找到了这两种方法 它们分别执行我想要的操作 sendEmail recipient subject body options sendEmail to
  • Java GraphTraversal 输出 Gremlin 查询

    如何从 Java 输出 Gremlin 查询GraphTraversal目的 默认输出 graphTraversal toString 好像 HasStep label eq brand name eq Nike status within
  • 将 int 转换为 hex,然后转换为 00 00 00 00 的格式

    我有一个递增的整数 然后我想要十六进制 所以我像这样进行转换 myInt ToString X 然后我需要一个格式为 00 00 00 00 的字符串 但我无法找到一种方法将我现在拥有的十六进制字符串转换为这种格式 使用 Linq 查询 您
  • 在Android中搜索ListView项目后,始终打开ListView的第一个项目(问题)

    当我打开搜索到的项目时 它打开的是 ListView 的第一个项目 而不是搜索到的项目 即使搜索并成功找到该项目 让我举几个例子 如果我搜索Arrow 我可以得到Arrow但当点击时Arrow它将会Almost Human Almost H
  • WebSphere liberty 类默认加载 PARENT LAST

    我一直在研究使用 WebSphere 的 Liberty 配置文件作为一种轻量级替代方案 以替代在我的本地计算机上部署成熟的 WebSphere 实例 我知道 这有点晚了 我不明白的一件事 如何将 Parent Last 类加载设置为默认
  • DELIMITER // 在触发器中起什么作用?

    DELIMITER 它有什么用呢 它将语句分隔符从 to 这样你就可以写 在你的触发器定义中 MySQL 客户端不会将其误解为意味着你已经完成了它 注意 改回来的时候 DELIMITER not DELIMITER 正如我所看到的人们尝试做
  • 将矢量世界地图添加到 R 中的光栅动画

    我用以下内容创建了一个动画animate的功能raster包并想在其上添加世界矢量地图 这是我的代码 在对其进行动画处理之前 我根据月平均温度的 3D 数组创建了一个栅格块 r lt brick ncols nb cols nrows nb
  • 为 Python 安装 PyObjC 时出现问题

    我试图在我的 Mac OS X El Capitan 上安装 PyObjC 下载大约 40 分钟后 我收到一个错误 然后它停止了 我尝试在终端中使用以下代码进行安装 pip install pyobjc 错误说 Command python
  • jQuery 获取元素相对于窗口的位置

    给定 HTML DOM ID 如何在 JavaScript JQuery 中获取元素相对于窗口的位置 这与相对于文档或偏移父级不同 因为该元素可能位于 iframe 或某些其他元素内部 我需要获取当前显示的元素矩形的屏幕位置 如位置和尺寸
  • 如何高效地将 npy 转换为 xarray / zarr

    我有一个 37 GB 的 npy 文件 我想将其转换为 Zarr 存储 以便可以包含坐标标签 理论上我有代码可以做到这一点 但我总是内存不足 我想在中间使用 Dask 来促进分块执行此操作 但我仍然耗尽内存 这些数据是人们股骨软骨的 厚度图