Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 下载大型媒体文件时,请求使进程内存不足大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个简单的脚本来从CDN下载视频文件,其中直接URL很容易生成,例如 http://something.com/N.mp4,其中N是数字.

问题是,当下载大于300MB的文件时,文件完全出现在硬盘驱动器中,但在请求(…)的回调之前,会发生内存分配失败:

Fatal error: Call_AND_RETRY_0 AlLOCATIOn Failed - process out of memory

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

环境:Win7,4GB可用RAM,节点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

解决方法

如果您使用带有回调的请求模块,它会将整个响应主体缓冲在内存中.尝试省略回调并使用fs stream的finish事件.

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

大佬总结

以上是大佬教程为你收集整理的node.js – 下载大型媒体文件时,请求使进程内存不足全部内容,希望文章能够帮你解决node.js – 下载大型媒体文件时,请求使进程内存不足所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。