将大型数组传递给NumPy和SciPy函数

4
我希望使用scipy.ndimage.watershed_ift处理一张太大无法载入内存的图片。我能做的唯一选择是将图片切割成瓷砖,并逐个瓷砖进行处理吗?为了让这个方法可行,我需要想办法解决瓷砖边缘问题。瓷砖之间需要有重叠部分,并且我需要聪明地将它们拼接在一起。
是否有一种通用的方法将大数组传递给NumPy和SciPy函数呢?

图片有多大?(是一张图片,还是几十GB的图像立方体?)你已经对代码进行了分析吗?(例如使用a+=b而不是c=a+b这样的操作可以节省大量内存,如果内存是瓶颈,这也意味着它可以加速处理速度) - usethedeathstar
该死,无法编辑以前的评论,我突然想到了:你是否考虑购买更多的内存? 从(例如)4GB到16GB这样的升级可以大有裨益,而且成本并不高。 或者,如果您甚至考虑这个选项,图像是否太大了? 对于更具体的帮助,我们需要更多关于您如何实现所有内容的信息。 - usethedeathstar
@usethedeathstar:目前,我正在尝试在一个30000x30000的图像上运行ndimage.distance_transform_edt,但是它占用了12GB的内存。据我所知,我被困在负责分割/处理/拼接的工作中... - ajwood
1个回答

1

这是否意味着我需要负责抓取合理大小的块?例如,我能否将memmappyhdf5对象传递给scipy.ndimage.label()并期望它在不耗尽内存的情况下正确执行? - ajwood
@ajwood 是的,除非该进程在运行过程中创建了数组的副本。您可以将整个“memap”传递给该进程,它实际上会从您的硬盘访问数据。 - Saullo G. P. Castro
我认为SciPy的watershedlabel函数无法在memmap缓冲区上运行;我被迫始终在内存中至少拥有整个数组的一个副本。我相信我的唯一解决方案是在我的端上对它们进行分块,然后以聪明的方式将它们拼接回来... - ajwood
@ajwood 你在运行过程中使用 watershedlabel 监控了内存使用情况吗?我到目前为止还没有尝试过这些函数... - Saullo G. P. Castro
目前我卡在距离变换上了,在我的算法中它位于那些函数之前。 - ajwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接