node.js - 为什么 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, ..)
我无法理解内存不是免费的。
感谢您阅读我的问题。
打字可能有错别字,而不是粘贴。
解决方案
您可以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
});
推荐阅读
- php - 文本文件未写入服务器
- python-3.x - 设置变量时的Python语法错误
- c# - 如何创建一个统一用作按钮的模型?
- ios - How to set UIProgressView progress properly?
- mysql - SUM values or take MAX to SUM depending on value
- php - PHP 从组合列表中创建一个变体表
- html - Bootstrap 旋转木马垂直制作
- android - Android 中的 Google Pay API 集成
- javascript - 正则表达式捕获除数字和单词列表之外的所有字符
- sql-server - 通过 Liquibase 创建 mssql 作业