es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Límite de tamaño de s3.getObject() en aws-sdk.

Estoy tratando de procesar un archivo tif de 5GB utilizando sharp en una función lambda, pero la solicitud s3.getObject() falla con el siguiente error:

{
  "errorType": "RangeError",
  "errorMessage": "El valor \"5479395327\" no es válido para la opción \"size\"",
  "trace": [
    "RangeError [ERR_INVALID_OPT_VALUE]: El valor \"5479395327\" no es válido para la opción \"size\"",
    "    at Function.alloc (buffer.js:370:3)",
    "    at Object.alloc (/var/runtime/node_modules/aws-sdk/lib/util.js:136:28)",
    "    at Object.concat (/var/runtime/node_modules/aws-sdk/lib/util.js:175:28)",
    "    at Request.HTTP_DONE (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:424:36)",
    "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
    "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
    "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)",
    "    at IncomingMessage.onEnd (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:334:26)",
    "    at IncomingMessage.emit (events.js:326:22)",
    "    at IncomingMessage.EventEmitter.emit (domain.js:483:12)"
  ]
}

código:

const getObjectRequest: GetObjectRequest = {
    Bucket: bucket,
    Key: filename
};
const s3File = await s3.getObject(getObjectRequest).promise();

He configurado la memoria de la función lambda en 10240MB y el tiempo de espera en 15 minutos (máximo).

¿Hay alguna otra forma de cargar la imagen en sharp?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existen otras formas de cargar la imagen en Sharp. Una opción es utilizar el método createReadStream del SDK de AWS para transmitir el archivo a Sharp en lugar de cargar el archivo completo en la memoria de una sola vez. Esto puede ayudar con las limitaciones de memoria y permitirte procesar archivos más grandes.

    Aquí tienes un ejemplo de código que utiliza createReadStream:

    const getObjectRequest: GetObjectRequest = {
        Bucket: bucket,
        Key: filename
    };
    const readStream = s3.getObject(getObjectRequest).createReadStream();
    const sharpStream = sharp();
    
    readStream.pipe(sharpStream);
    
    sharpStream
        .resize(500)
        .toFormat('png')
        .toBuffer()
        .then((data) => {
            // maneja aquí los datos de la imagen procesada
        })
        .catch((err) => {
            // maneja aquí el error
        });
    

    Este código utiliza createReadStream para transmitir el objeto S3 a Sharp, de modo que el archivo completo no se carga en la memoria de una sola vez. La tubería de Sharp redimensiona la imagen y la convierte al formato PNG antes de devolver los datos de la imagen procesada. Puedes modificar esta tubería para adaptarla a tus necesidades específicas de procesamiento.

    Ten en cuenta que es posible que también necesites aumentar el tiempo máximo de ejecución o la memoria de tu función Lambda dependiendo del tamaño del archivo y la complejidad de la tubería de Sharp.

Comments are closed.