GEE:分块处理以降低内存压力

作者:CSDN @ _养乐多_

从 456535 毫秒,到粉丝的 2931 毫秒,再到 30 毫秒。从旧版本到新版本,提升了 15000 多倍速度。

在 Google Earth Engine(GEE)平台上处理大型数据集时,加载整个数据集可能导致内存不足的问题。分块处理可以将数据划分为小块,逐块处理,从而有效降低内存压力。这对于处理大规模数据集、避免系统崩溃和提高算法性能至关重要。

本文将介绍如何通过分块处理优化GEE中矢量数据的操作的 API,以提高效率、降低资源消耗。


文章目录

      • 一、旧版本
          • 1.1 旧版本
          • 1.2 粉丝改进代码
      • 二、新版本代码
          • 2.1 代码链接
          • 2.2 示例代码
          • 2.3 结果展示


一、旧版本

1.1 旧版本

《GEE:内存超限?将研究区划分成规则的小块运算》

程序执行时间: 456535 毫秒。

以前的时候记录了一个使用 for 循环将矢量数据划分成小区域以便解决内存超限问题,但是现在用户量越来越多,GEE能够给用户分配的内存越来越少,for 循环的计算速度又很慢,没有像 map 函数那样在服务器上并行计算快速,并能减少客户端和服务器端的数据传输次数以增加计算速度。

结果展示,

GEE:分块处理以降低内存压力_第1张图片
1.2 粉丝改进代码

在旧版本博客的分享过程中,有粉丝朋友分享了自己在此基础上用 map 函数替换 for 函数的代码,写的很好,本文1.2节有代码链接和展示,但是裁剪后的矢量数据存在以下3个问题:(1)无法去除多余的矢量边界外的分块;(2)代码中使用了 getInfo 函数来读取坐标点,会降低计算速度;(3)丢失了顶部部分小块。

代码链接

程序执行时间: 2931 毫秒。

结果展示,

GEE:分块处理以降低内存压力_第2张图片

二、新版本代码

2.1 代码链接

示例代码链接:https://code.earthengine.google.com/98be6d26c850bc2b84498012eccd96f4?noload=true

2.2 示例代码

在经过修改后,为了解决以上问题,本人对代码进行了优化,使其计算速度加快,并且不丢失任何小区域矢量边界,且外围矢量边界和分割后的小块边界适配。本人对核心代码进行了封装,访问该代码直接调用 API 即可。

调用接口是vecSplitByRowCol函数,函数有三个参数,分别为矢量边界、行数、列数。返回值是一个featureCollection,该集合中包含所有分割后的小块的 feature 对象。

参数名称 类型 说明
矢量边界数据 必须转为geometry对象 矢量边界数据,比如 table.geometry()
行数 整数 想要分块的行数,比如5
列数 整数 想要分块的列数,比如5
返回值 featureCollection 返回一个矢量数据集合,包含了分割后每个小块的矢量数据

代码示例如下所示。

Map.centerObject(table, 5);

// 记录程序开始时间
var startTime = new Date();
print(startTime);

var eevp = require('users/949384116/lib:Tools/VectorProcessor')

var featureCollection = eevp.vecSplitByRowCol(table.geometry(), 5, 5)
    .filterBounds(table.geometry())
    .toList(100)

featureCollection.size().evaluate(function (nSize) {
    // print('Feature Collection Size: ', nSize)
    for (var i = 0; i < nSize; i++) {
        var smallVec = ee.Feature(featureCollection.get(i)).geometry()
            .intersection(table.geometry())
        Map.addLayer(smallVec, {}, 'Vec ' + i)
        
        // 这里可以执行你的自定义代码,实现你在小区域的需求,比如数据计算、数据下载等


    }
});

// 记录结束时间
var endTime = new Date();
print(endTime);

// 计算执行时间(以毫秒为单位)
var executionTimeMS = endTime - startTime;
var executionTimeStringMS = executionTimeMS.toString() + ' 毫秒';
print('程序执行时间: ' + executionTimeStringMS);
2.3 结果展示
GEE:分块处理以降低内存压力_第3张图片

你可能感兴趣的:(GEE,GEE,云计算,javascript,遥感图像处理)