我正在处理一个大文件,我正在发出一个HTTP请求来获取数据。响应通过流
传输fs.createReadStream(pathToFile).pipe(res)
我的请求功能如下所示
function makeRequest(requestData, IP) {
var options = {
host: IP,
port: 5000,
path: '/read',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
var req = http.request(options, function(res) {
//res.setEncoding('binary');
var data = [];
res.on('data', function(chunk) {
data.push(chunk);
});
res.on('end', function() {
//fs.appendFileSync(fileName, data);
var binary = Buffer.concat(data);
var writeStream = fs.createWriteStream(fileName, { "flags": 'a' });
writeStream.write(binary);
writeStream.end();
});
res.on('error', function(err){
console.log("Error during HTTP request");
console.log(err.message);
});
});
req.write(requestData);
req.end();
}
我相信由于它的数据量如此之大,它会影响内存,而服务器只会崩溃。我该怎么处理这个?
这个问题是基于另一个问题,我曾经问过 (Reading large files in Node.js from another server)
答案 0 :(得分:1)
您的服务器不会崩溃,因为您要求这样大的文件或保存它们,而是因为您这样做:
var data = [];
您将整个1GB(或文件的大小)缓存到RAM中!并以一种非常消耗内存的方式(为什么不是缓冲区?)。相反,您应该将数据直接写入文件,不要缓存它:
var writeStream = fs.createWriteStream(fileName, { "flags": 'a' });
res.on('data', function(chunk) {
writeStream.write(chunk);
});
res.on('end', function() {
writeStream.end();
});
实际上可以简化为:
res.pipe(fs.createWriteStream(fileName, { "flags": 'a' }))
通过只有几个块保留在RAM中,并且在写入硬盘后将被删除。