Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么AWS Lambda中的Node.js占用了这么多内存?_Javascript_Node.js_Aws Lambda_Tesseract.js - Fatal编程技术网

Javascript 为什么AWS Lambda中的Node.js占用了这么多内存?

Javascript 为什么AWS Lambda中的Node.js占用了这么多内存?,javascript,node.js,aws-lambda,tesseract.js,Javascript,Node.js,Aws Lambda,Tesseract.js,我正在使用AWS Lambda运行OCR处理功能。我不得不将lambda函数的内存提升到最大值(1536MB),这样它就不会因为内存问题而崩溃。即使如此,该过程也几乎达到了最大阈值: Duration: 54133.61 ms Billed Duration: 54200 ms Memory Size: 1536 MB Max Memory Used: 1220 MB 奇怪的是,我之所以发布这个问题,是因为为什么这会占用这么多的内存?如果我在只有512MB内存的开发环境中运行相同的进程,

我正在使用AWS Lambda运行OCR处理功能。我不得不将lambda函数的内存提升到最大值(1536MB),这样它就不会因为内存问题而崩溃。即使如此,该过程也几乎达到了最大阈值:

Duration: 54133.61 ms   Billed Duration: 54200 ms Memory Size: 1536 MB  Max Memory Used: 1220 MB
奇怪的是,我之所以发布这个问题,是因为为什么这会占用这么多的内存?如果我在只有512MB内存的开发环境中运行相同的进程,它仍然可以毫无问题地完成

我用于这些测试的图像大约只有350KB左右

以下是我的代码片段:

Tesseract.recognize(img)
  .catch(err => reject(err))
  .then(function(result) {
    Tesseract.terminate();
    console.log(result);
  }));
});
以下是我的代码的更完整版本:

Tesseract.recognize(img)
  .catch(err => reject(err))
  .then(function(result) {
    Tesseract.terminate();
    console.log(result);
  }));
});
lambda.js:

exports.handler = function(event, context, callback) {
    let snsMessage = getSNSMessageObject(
        JSON.stringify(event.Records[0].Sns.Message));
    let bucket = snsMessage.Records[0].s3.bucket.name;
    let key = snsMessage.Records[0].s3.object.key;

    let bookId = key.split('.')[0].split('/')[0];
    let pageNum = key.split('.')[0].split('/')[1];

    s3.getImage(bucket, key)
        .then(function(data) {
            return ocr.recognizeImage(data.Body);
        })
        .then(function(result) {
            return s3.uploadOCR(bucket, bookId, pageNum, result);
        })
        .then(fulfilled => callback(null))
        .catch(error => callback(error, 'Error'));

};
助手功能:

    getImage: function getImage(bucket, key) {
        // Obtener la imagen de S3
        let params = {Bucket: bucket, Key: key};
        return s3.getObject(params).promise();
    },

    uploadOCR: function uploadOCR(bucket, bookId, pageNum, ocr) {
        // Subir el OCR JSON a S3
        let params = {
            Bucket: bucket,
            Key: (bookId + '/' + pageNum + '.json'),
            Body: ocr,
            ContentType: 'application/json'
        };

        return s3.putObject(params).promise();
    }

    recognizeImage: function recognizeImage(img) {
        return new Promise(function(resolve, reject) {
            // Procesar con TesseractJS
            Tesseract.recognize(img)
                .catch(err => reject(err))
                .then(function(result) {
                    Tesseract.terminate();

                    let ocr = {};
                    ocr['paragraphs'] = result.paragraphs.map(
                        p => ({'bbox': p.bbox, 'baseline': p.baseline,
                        'lines': p.lines.map(
                            l => ({'bbox': l.bbox, 'baseline': l.baseline,
                            'words': l.words.map(
                                w => ({'text': w.text, 'bbox': w.bbox,
                                'baseline': w.baseline}))
                            }))
                     }));
                    resolve(JSON.stringify(ocr));
                });
        });

.catch(err=>reject(err))
”-嗯,避免这种情况!当您将AWS内存设置为与您的开发机器相同时,它失败的错误消息是什么?@Bergi没有错误消息。函数只是过早结束,CloudWatch中没有显示Tesseract进度日志(来自
progress()
callback)。@Bergin您能详细介绍一下这个Promise构造函数反模式吗?我没有使用任何延迟,我只使用JavaScript本机承诺。上面的示例来自TesseractJS文档:。我之所以在catch中调用
reject()
,是因为上面的代码片段链接到了其他promise操作(从S3获取、将结果上传到S3等)啊,我明白了。Tesseract没有返回一个真正的承诺,而是一个“受ES6承诺接口启发”的作业对象,这让它有点奇怪。它应该足够相似,但能够吸收它:
返回Promise.resolve(Tesseract.recognize(img))。然后(result=>{Tesseract.terminate();…返回JSON.stringify(ocr);})
。catch(err=>拒绝(err))
”-嗯,避免错误!当您将AWS内存设置为与您的开发机器相同时,它失败的错误消息是什么?@Bergi没有错误消息。函数只是过早结束,CloudWatch中没有显示Tesseract进度日志(来自
progress()
callback)。@Bergin您能详细介绍一下这个Promise构造函数反模式吗?我没有使用任何延迟,我只使用JavaScript本机承诺。上面的示例来自TesseractJS文档:。我之所以在catch中调用
reject()
,是因为上面的代码片段链接到了其他promise操作(从S3获取、将结果上传到S3等)啊,我明白了。Tesseract没有返回一个真正的承诺,而是一个“受ES6承诺接口启发”的作业对象,这让它有点奇怪。它应该足够相似,以便能够吸收它:
返回Promise.resolve(Tesseract.recognize(img))。然后(result=>{Tesseract.terminate();…返回JSON.stringify(ocr);})