1 votos

Capacidad de memoria del motor de Google Earth superada

Estoy intentando exportar a una tabla csv el total de precipitaciones por mes-año por polígono (~5571 polígonos) desde 2001-2019 (228 pasos de tiempo). Estoy utilizando el CHIRPS (datos diarios), por lo que hubo que reducir los datos a la media mes-año.

Puedo descargar unos dos meses de datos pero cuando intento descargar más de 2 años de datos me sale el mensaje: Error: Límite de memoria del usuario excedido.

He probado todas las sugerencias que he encontrado buscando en Internet.

¿Hay alguna forma de reescribir mi código ( enlazado aquí ) para no recibir este mensaje de error?

// Set years and month
var startYear = 2001;
var endYear = 2019; //need to run in subsets?
var years = ee.List.sequence(startYear, endYear);
var months = ee.List.sequence(1,12);

// load the image collection
var Daily = ee.ImageCollection("UCSB-CHG/CHIRPS/DAILY")

//~5571 features (polygons)  
var municipalities = ee.FeatureCollection("shapefiles")

//rescale features to help with memory error
var municipScaled = municipalities.map(function(feature) {
  return feature.simplify(100);
});

// make monthly summed mosaics
// loop over the years and months to get summed monthly images
var byMonth = ee.ImageCollection(ee.FeatureCollection(years.map(function(y){
  var yearCollection = Daily.filter(ee.Filter.calendarRange(y, y, 'year'));
  var byYear = ee.ImageCollection.fromImages(
    months.map(function(m) {
      var summedImage = yearCollection.filter(ee.Filter.calendarRange(m, m, 'month'))
                  .reduce(ee.Reducer.sum()); 
      var date = ee.Date.fromYMD(y, m, 1).format("MM_dd_YYYY");
      return summedImage.set('system:time_start', ee.Date.fromYMD(y, m, 1)).rename(ee.String("summed_precip")
                                       .cat(date));
      //.set('month', m).set('year', y); // eventually set year and month 
  }));
  return byYear;
})).flatten());
print(byMonth)

// filter the empty one out
var outputMonthly = byMonth.filter(ee.Filter.listContains('system:band_names', 'constant').not())
                    .sort('system:time_start').toBands();
print(outputMonthly);

//test to make sure range makes sense
//Map.addLayer(outputMonthly.select("0_0_summed_precip01_01_2001"), {min:0, max:50});

//determine scale
var scale = Daily.first().projection().nominalScale();
print(scale)

//reduce to total precipitation per municipality 
var muncip_monthly_precip = outputMonthly.reduceRegions(municipScaled, ee.Reducer.sum(), 5000, 'EPSG:4326')
                                .map(function(feature){
                      return(ee.Feature(feature).setGeometry(null)); // map over the feature collection and drop the geometry for memory saving
                    }).copyProperties(municipScaled, ee.List(["CD_MUN"])); 

// save the table to google drive                    
Export.table.toDrive({
  collection: muncip_monthly_precip,
  description: "total_monthly_precip",
  folder: 'VL_GEE',
  fileFormat: 'CSV'})

2voto

JonasV Puntos 41

Lo más probable es que su problema sea esta línea:

var outputMonthly = byMonth.filter(ee.Filter.listContains('system:band_names', 'constant').not())
                .sort('system:time_start').toBands();

Supongo que está utilizando toBands() para poder llamar fácilmente a .reduceRegions() . El gran inconveniente es que Earth Engine tiene que asignar una cantidad ridícula de ee.Image con más de 200 bandas que abarcan toda la tierra. En su lugar, debe mantenerlo como una colección de imágenes y hacer un mapa sobre él, así:

var outputMonthly = byMonth.filter(ee.Filter.listContains('system:band_names', 'constant').not())
                .sort('system:time_start')

var muncip_monthly_precip = outputMonthly.map(function(image){
  return image.reduceRegions({
    collection: municipScaled, 
    reducer: ee.Reducer.sum(), 
    scale: 5000
  })
})
var flat = muncip_monthly_precip.flatten()

Al final hay que aplanarlo, para pasar de una colección de colecciones a una colección plana de características.

Si esto sigue fallando, sugiero deshacerse de todas las sentencias print y si sigue fallando es probable que municipScaled simplemente tiene demasiadas y grandes características.

En fin, espero que esto ayude.

0voto

XRougu3X Puntos 1

Usando este código (aumentando tileScale) también funcionó para exportar a tabla sin obtener el error de memoria de usuario.

// Set years and month
var startYear = 2001;
var endYear = 2019; 
var years = ee.List.sequence(startYear, endYear);
var months = ee.List.sequence(1,12);

// make monthly summed mosaics
// loop over the years and months to get summed monthly images
var byMonthYear = ee.ImageCollection.fromImages(
  years.map(function(y) {
    return months.map(function (m) {
      var date = ee.Date.fromYMD(y, m, 5).format("MM_dd_YYYY");
      return Daily
        .filter(ee.Filter.calendarRange(y, y, 'year'))
        .filter(ee.Filter.calendarRange(m, m, 'month'))
        .reduce(ee.Reducer.sum())
        .set('month', m).set('year', y)
        .rename(ee.String("summed_precip")
                                       .cat(date));
  });
}).flatten());

//print(byMonthYear)

var singleImage = byMonthYear.toBands();

var muncip_monthly_precip = singleImage.reduceRegions({
  collection: municipalities, 
  reducer: ee.Reducer.sum(), 
  scale : 5000,
  tileScale : 16
})
                                .map(function(feature){
                      return(ee.Feature(feature).setGeometry(null)); // map over the feature collection and drop the geometry for memory saving
                    }).copyProperties(municipalities, ee.List(["CD_MUN"]));

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X