首页 > 解决方案 > 为什么 node.js 为 end 函数获取内存?

问题描述

每天,我都会保存保存在S3生成​​另一台服务器中的文本文件。

问题是,在结束read_s3_save_txt()函数之后,内存不是空闲的。

文件大小约为 200mb。

在代码下是我的read_s3.js,我用pm2.

// read_s3.js
var fs = require('fs');
var AWS = require('aws-sdk');
var moment = require('moment');
var schedule = require('node-schedule');
var async = require('async');

// run read_s3_save_txt() at 6:00 once.
var j = schedule.scheduleJob("0 0 6 * * *", function() {
  read_s3_save_txt();
});

function read_s3_save_txt() {
  var dateString = moment().format("YYYY-MM-DD"); // sample : "2021-01-01"

  var async_tasks = [
    function(callback) {
      var s3 = new AWS.S3();
      var params = { Bucket: '..bucketname..', Key: '..keyname..' };
      s3.getObject(params, function(err, data) {
        if(err) {
          callback(null, null);
        }
        else {
          callback(null, data.Body);
        }
      });
    },
    function(dataBody, callback) {
      if(dataBody) {
        console.log("data is null");
        callback(null);
      }
      else {
        fs.writeFile(`${dateString}.txt`, dataBody, 'utf8', function(err) {
          if(err) console.log("writeFile error");
          callback(null);
        });
      }
    } // end of function
  ];

  async.waterfall(async_tasks, function(err) {
    if(err) console.log(err);
    console.log("save end");
  });
}

使用 pm2 运行和监控

$ sudo pm2 start read_s3.js

$ sudo pm2 monit

[ 0] read_s3.js    Mem:  86 MB    CPU:  0 %  online  ## normal.
[ 0] read_s3.js    Mem: 300~MB    CPU: 10~%  online  ## at read (6:00)
[ 0] read_s3.js    Mem: 300~MB    CPU:  0 %  online  ## after read, Mem left still (7:00, 8:00, ..)

我无法理解内存不是免费的。

感谢您阅读我的问题。


打字可能有错别字,而不是粘贴。

标签: node.jsamazon-s3

解决方案


您可以s3.getObject使用readStream.

  • 基本的
var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-2';
var s3 = new AWS.S3();
var file = require('fs').createWriteStream('save.txt');
var params = {Bucket:'bucket', Key:'key'};
s3.getObject(params).createReadStream().pipe(file);

介绍我自己的代码。
每当我想使用 s3 时,我都将它用作语法

s3.getObject(params)
.createReadStream()
.on('error', (e) => {
  // handle aws s3 error from createReadStream
})
.pipe(unzip)
.on('data', (data) => {
  // retrieve data
})
.on('end', () => {
  // stream has ended
})
.on('error', (e) => {
  // handle error from unzip
});

推荐阅读