当前位置: 首页 > 面试题库 >

使用node.js下载大文件,避免占用大量内存

余铭晨
2023-03-14
问题内容

我正在尝试创建一个文件下载程序作为后台服务,但是当计划了一个大文件时,首先将其放入内存中,然后在下载结束时将文件写入磁盘。

考虑到我可能同时下载许多文件,如何使文件逐渐写入磁盘保留内存?

这是我使用的代码:

var sys = require("sys"),
    http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    events = require("events");

var downloadfile = "http://nodejs.org/dist/node-v0.2.6.tar.gz";

var host = url.parse(downloadfile).hostname
var filename = url.parse(downloadfile).pathname.split("/").pop()

var theurl = http.createClient(80, host);
var requestUrl = downloadfile;
sys.puts("Downloading file: " + filename);
sys.puts("Before download request");
var request = theurl.request('GET', requestUrl, {"host": host});
request.end();

var dlprogress = 0;


setInterval(function () {
   sys.puts("Download progress: " + dlprogress + " bytes");
}, 1000);


request.addListener('response', function (response) {
    response.setEncoding('binary')
    sys.puts("File size: " + response.headers['content-length'] + " bytes.")
    var body = '';
    response.addListener('data', function (chunk) {
        dlprogress += chunk.length;
        body += chunk;
    });
    response.addListener("end", function() {
        fs.writeFileSync(filename, body, 'binary');
        sys.puts("After download finished");
    });

});

问题答案:

我将回调更改为:

request.addListener('response', function (response) {
        var downloadfile = fs.createWriteStream(filename, {'flags': 'a'});
        sys.puts("File size " + filename + ": " + response.headers['content-length'] + " bytes.");
        response.addListener('data', function (chunk) {
            dlprogress += chunk.length;
            downloadfile.write(chunk, encoding='binary');
        });
        response.addListener("end", function() {
            downloadfile.end();
            sys.puts("Finished downloading " + filename);
        });

    });

这工作得很好。



 类似资料:
  • 问题内容: 我需要使用curl下载远程文件。 这是我的示例代码: 但是它不能处理大文件,因为它首先读取内存。 是否可以将文件直接流式传输到磁盘? 问题答案:

  • 我们有一个运行在Linux上的Weblogic服务器,有多个受管服务器。我所关心的托管服务器的最大堆大小为1024MB。该服务器上部署了多个应用程序。其中一个应用程序处理来自REST api的响应来下载250MB的文件。对于大于50 MB的文件,有时没有问题,但有时服务器会因OOM错误而崩溃。以下是我的代码: 由于存在内存问题,我尝试采用InpuStream方法。以下是更改后的代码: 此代码没有进

  • 我正在使用泽西客户端进行基于超文本传输协议的请求。如果文件很小,它会很好地工作,但当我发布大小为700M的文件时会出错: 这是我的代码:

  • Chrome的Blob存储系统设计文档提到了以下内容。 如果blob的内存空间已满,或者新的blob太大而无法在内存中,那么blob系统将使用磁盘。这可以是将旧的blob分页到磁盘,或者直接将新的太大的blob保存到磁盘。 然而,即使在多次浏览文档之后,我仍然有以下担忧: null https://github.com/eligrey/filesaver.js/#supported-browser

  • 问题内容: 我正在使用可写流使用node.js编写一个大文件: 我想知道这种方案在不使用事件的情况下是否安全?如果不是(我认为是这种情况),那么将任意大数据写入文件的模式是什么? 问题答案: 这就是我最终做到的方式。背后的想法是创建实现ReadStream接口的可读流,然后使用方法将数据通过管道传输到可写流。 可以从猫鼬QueryStream中获取类的示例。

  • 我有一个文件表示为块的列表,目标是下载所有块,加入并保存为一个文件。 它应该适用于大文件 应该是跨浏览器解决方案 null null null null 但我仍然无法实现我的目标与涵盖的需求… 如果有人有经验,最好的解决方案,我恳请分享它在这里。谢谢