0

ファイルを一括ダウンロードするノード スクリプトを作成しています。この例では、これらは各行にファイル名と URL が含まれるファイルの画像です。このスクリプトを数百万の URL までスケールアップしてダウンロードできるようにしたいと考えています。

ノード JS ストリームは、URL リストをパイプで渡し、URL を http 要求し、応答をファイルに書き込むことができるため、これを行うのに適しているようです。

このスクリプトは私のコンピューターをクラッシュさせ、空白の jpg ファイルを書き込んでいます。メソッドはpipe()背圧を処理していないようです。スクリプトはすぐにすべての URL を並行して要求しているようです。多数の URL をダウンロードするためにスケーリングするときに一貫して実行できるように、この同時 HTTP 要求の数を制限するにはどうすればよいですか? ありがとう。

'use strict';
var fs      = require('fs'),
    request = require('request'),
    through = require('through'),
    split   = require('split'),
    urlList = 'https://gist.githubusercontent.com/phelma/e1558aeb181c0cfe47b8/raw/cc5e667277308fda408f6af1404bc2d322b5186c/images.txt';
    // 10000 images

var splitByTab = through(function(buf) {
    var item = buf.toString().split('\t');
    this.queue(item);
});

var downloadStream = through(function(item) {
    // item is array [ filename , URL ]
    if (item[1]) {
        console.log('Requesting ' + item[1]);
        request
            .get(item[1])
            .on('error', function(err) {
                console.log('\nError: ' + err.message + '\n' + item[1]);
            })
            .pipe(fs.createWriteStream(__dirname + '/out/' + item[0] + '.jpg'));
    }
});

request
    .get(urlList) // Request the
    .pipe(split()) // Split file into rows
    .pipe(splitByTab) // Split each row into a array items
    .pipe(downloadStream); // Download each item
4

1 に答える 1