为什么AWS Lambda中的Node.js会占用如此多的内存?

时间:2017-11-24 00:04:19

标签: javascript node.js aws-lambda tesseract.js

我正在使用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));
                });
        });

0 个答案:

没有答案