2016-11-01 2 views
0

Ich habe eine einfache NodeJs-Anwendung, die als REST-Client fungiert und ein großes JSON-Objekt anfordert. Das Problem ist, dass der Speicher immer knapp ist (mehr als 6 GB). Ich benutze manuelle Speicherbereinigung (App gestartet mit --expose_gc), aber das scheint nicht viel zu helfen.Das Anfordern großer JSON-Objekte führt zu einem Speicherleck.

Hier ist mein Code:

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(); 

I Anfrage Bibliothek versucht haben, aber ich hatte die gleichen Ergebnisse. Was mache ich falsch?

Ps.s. Meine nodejs-Version ist 6.9.1, Nadelversion 1.3.0

Antwort

0

Verwenden Sie Knoteninspektor, um Leckage zu finden. Es könnte ein interner Knoten sein oder ein Leck von Nadel und Anforderung. Ich würde lieber native http.request verwenden, um sicherzustellen, dass es kein Bibliotheksproblem ist. Sie können Ihren Code auch in unabhängige Teile aufteilen und separat ausführen, um die Leckquelle zu finden.

Es gibt another answer, wie Speicherverluste erkannt werden.

0

Ich habe einen Fehler gefunden. Ich war die setInterval statt SetTimeout mit ....

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(); 
0

Es ist, weil Sie mit zu viel Informationen arbeiten, sollten 6Gb mit behandelt werden Bächen.
Es ist sehr einfach mit Nadel, vermeiden Sie einfach den Rückruf.
Hier ist ein Beispiel:

'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); 
+0

Die JSON ist nicht 6Gb, es viel weniger ist. Die 6Gb war die Menge an verwendetem RAM aufgrund der Tatsache, dass ich setInterval anstelle von setTimeout verwendete ... – Jkam

Verwandte Themen