Javascript 为什么AWS Lambda中的Node.js占用了这么多内存?
我正在使用AWS Lambda运行OCR处理功能。我不得不将lambda函数的内存提升到最大值(1536MB),这样它就不会因为内存问题而崩溃。即使如此,该过程也几乎达到了最大阈值: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内存的开发环境中运行相同的进程,
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);})