0

REST クライアントとして機能し、大きな JSON オブジェクトを要求する単純な NodeJs アプリケーションがあります。問題は、常にメモリが不足することです (6Gb 以上を消費します)。手動のガベージ コレクション (アプリは --expose_gc で開始) を使用していますが、あまり役に立たないようです。

これが私のコードです:

var needle = require('needle');
function getAllData() {
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");

    setInterval(function () {
        getAllData();
    }, 10 * 1000);
}

function getDataFromUrl(url) {
    needle.get(url, function (error, response) {
        if (!error && response.statusCode == 200) {
            console.log("do something");
        }
    });
}

function scheduleGc() {
    global.gc();
    setTimeout(function () {
        scheduleGc();
    }, 100 * 1000);
}

getAllData();
scheduleGc();

request ライブラリを試してみましたが、同じ結果が得られました。私は何を間違っていますか?

Ps 私の nodejs のバージョンは 6.9.1、針のバージョンは 1.3.0 です

4

3 に答える 3

0

エラーが見つかりました。setTimeout の代わりに setInterval を使用していました....

var needle = require('needle');
function getAllData() {
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
    getDataFromUrl("http://puppygifs.tumblr.com/api/read/json");
}

function getDataFromUrl(url) {
    needle.get(url, function (error, response) {
        if (!error && response.statusCode == 200) {
            console.log("do something");
        }
    });
}

function scheduleGc() {
    global.gc();

    setTimeout(function () {
        scheduleGc();
    }, 100 * 1000);
}

setInterval(function () {
    getAllData();
}, 10 * 1000);

scheduleGc();
于 2016-11-01T15:02:29.790 に答える
0

これは、あまりにも多くの情報を扱っているためです。6Gb はストリームで処理する必要があります。needle
を 使えばとても簡単です。コールバックを避けるだけです。 次に例を示します。

'use strict';
 const needle = require('needle');
 const fs = require('fs');
 const out = fs.createWriteStream('bigFile.json');
 needle.get('http://puppygifs.tumblr.com/api/read/json').pipe(out);
于 2016-11-01T15:05:48.307 に答える