前言
果然没有什么代码是一帆风顺的,本来已经写好的随机森林RF分类,在少量特征集合上运行OK,特征维数增加后到处都显示 User memory limit exceeded!头大,记录一下解决过程。
一、占用内存多的步骤
我的代码结构为:
导入Sentinel-2数据并预处理----提取S2特征----导入Sentinel-1数据并预处理----提取S1特征----导入DEM数据----提取地形特征—整合所有特征—RF分类
其中最占用内存的步骤包括:
- 导入原始影像集,尤其是原始数据集时间、空间范围较大时;
- 影像提取纹理特征并做PCA,这一步在特征维数多时计算很慢甚至超出内存;
- 影像重投影reproject
- RF分类器的计算
二、解决方法
1. 研究区域划分区块分别计算
https://blog.csdn.net/weixin_41099712/article/details/130246785
但是感觉有点麻烦,之后还要合成一张图
2.主动让步:缩小数据时间范围、降低分辨率、缩小研究区
3. 优化代码
- 成为付费用户(bushi)及代码优化方法:GEE:GEE平台怎么提高用户内存限制
- Google Earth Engine(GEE)——缩放错误指南(聚合过多、超出内存、超出最大像素和超出内存限制)!
- GEE(Google Earth Engine)—— 避免不必要地转换为列表
我采用的就是以上帖子中的方法,最有用的是:
将每种数据的导入–处理–特征提取步骤分开成不同脚本分别运行,将提取后的特征Export.image.toDrive,然后在任务栏把它们导出到assets,最后用RF分类的时候再把所有特征导入,所有的飘红都消失了!
4. RF分类器内存超限:增大tileScale参数。见GEE随机森林法报错user memory limit exceeded!
3. 新的问题已经出现!
报错:Earth Engine memory capacity exceeded
暂时还没找到解决途径
现在的情况是:
仅运行Sentinel-2影像处理、特征提取过程,能得到最终的特征集,但是会飘红,包括但不限于:
s2_mosaic: Tile error: Output of image computation is too large (3 bands for 971100756 pixels = 11113.4 MiB > 80.0 MiB).
If this is a reduction, try specifying a larger ‘tileScale’ parameter.
运行一次这条报错7次,而且是结果已经计算出来后等待好一会才报错。我尝试从后往前不断删掉一些步骤,看从哪一步开始报错,结果是一计算纹理特征就出错!
GEE你总是内存不足的样子真的很狼狈!和我的C盘一样不堪一击!不堪重负!
我的研究区大小为7000km2,已经在考,划分成县一个一个做了。。。