我正在处理一个大文件,我正在其中发出 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)
最佳答案
您的服务器不会崩溃,因为您正在请求如此大的文件或保存它们,而是因为您这样做了:
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' }))
这样,只有少数 block 保留在 RAM 中,并且在写入硬盘后将被删除。
关于javascript - 如何处理 Node.js 中大文件的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285119/