我正在使用TesseractJS在AWS Lambda中运行OCR处理功能。我不得不将lambda函数的内存增加到最大值(1536 MB),因为内存问题不会崩溃。即使这样,该过程几乎达到最大阈值:
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);
}));
});
以下是我的代码的更完整版本:
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));
});
});