gpt4 book ai didi

node.js - 下载大媒体文件时,请求使进程内存不足

转载 作者:搜寻专家 更新时间:2023-10-31 23:17:33 25 4
gpt4 key购买 nike

我写了一个简单的脚本来从 CDN 下载视频文件,其中的直接 URL 很容易生成,例如 http://something.com/N.mp4 ,其中 N 是一个数字。

问题是,当下载大于 ~300MB 的文件时,文件在硬盘中完美显示,但在 request(...) 的回调之前,发生内存分配失败:

FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

发生这种情况是因为一些严重的不良做法吗?可以请求下载这个大小的媒体文件吗?

环境:Win7、4GB+ 可用内存、Node v0.10.31

var request = require('request');
var async = require('async');
var fs = require('fs');
var start = +process.argv[2] || 1;
var end = +process.argv[3] || 50;
var url = 'http://something.com/';

try {
fs.mkdirSync(__dirname + '/videos/');
} catch (e) {}

var index = start;

async.whilst(
function () { return index <= end; },
function (callback) {
var fileName = index + '.mp4';
console.log('Started: ' + fileName);
console.time('Done (' + fileName + ')');
request(url + fileName, function() {
console.timeEnd('Done (' + fileName + ')');
index++;
callback(null);
}).pipe(fs.createWriteStream(__dirname + '/videos/' + fileName));
},
function (err) {
if (err) {
return console.error(err);
}
console.log('Script finished.');
}
);

示例控制台输出:

> node index.js 3
Started: 3.mp4
Done (3.mp4): 296592ms
Started: 4.mp4
Done (4.mp4): 369718ms
Started: 5.mp4
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory

最佳答案

如果您将 request 模块与回调一起使用,它会在内存中缓冲整个响应主体。尝试省略回调并改用 fs 流的 finish 事件。

var writer = fs.createWriteStream(__dirname + '/videos/' + fileName);
writer.on('finish', function() {
// ...
index++;
callback(null);
});
request(url + fileName).pipe(writer);

关于node.js - 下载大媒体文件时,请求使进程内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com