-1

我正在对 nodejs 进行抓取操作,我正在使用请求连接到站点,cheerio 访问数据,mongodb 存储提取的数据。我也使用 async.js 来避免无限递归。

我遇到了内存问题,因为我的进程占用了内存并且没有释放它。我认为问题出在 mongodb 上,因为如果我不使用 mongodb,内存就会保持稳定。

这是我总结的代码:

// Use function scrape_urls to process the urls
var q = self.asyn.queue(scrape_urls, 3);

//I push a bunch of urls ...    
for (var j = 0; j < self.urls_data.length; j++) {
    q.push(self.urls_data[j]);
}

q.drain = function () {
    console.log("END");
};

function scrape_urls(data_url, next_action) {
    request({
        method: 'GET',
        url: data_url.url
    }, function (err, response, body) {

        var $ = cheerio.load(body);
        data = { // ... scraped data ... };

        mongo_client.connect(connection_string, function (err, db) {

            if (err) { return console.dir(err); }

            var collection = db.collection('foo');

            collection.insert(data);

            next_action();

        });
    });
};

正如我所说,如果我避免使用 mongodb,而只使用 request 连接到 url,内存不会无限增长,我认为连接到 mongodb 是问题所在。

有任何想法吗?

4

1 回答 1

0

问题解决了。

我在这里留下一个解决方案。我做了一个助手来重用连接并只维护一个(毕竟nodejs是单线程的):

var MongoDbHelper = function (mongo_client, connection_string){  
    var self = this;

    this.mongo_client = mongo_client;       
    this.connection_string = connection_string;
    this.db = undefined;

    self.log = function (thread, str)
    {
        console.log(new Date().toISOString() + ' ' + process.memoryUsage().rss + ' [' + thread + '] ' + str);
    }   

    self.getcollection = function(collection_name, callback)
    {
        var collection = null;

        try
        {
            collection = self.db.collection(collection_name);       
        }
        catch(ex)
        {
            self.db = undefined;    
        }               

        // reconnecting if the connection is lost
        if(self.db == undefined)
        {
            self.mongo_client.connect(connection_string, function(err, db) {

                self.db = db;
                var collection = self.db.collection(collection_name);
                callback(err, self.db, collection);

            });                         
        }   
        else
        {           
            callback(null, self.db, collection);    
        }
    }

};

module.exports = MongoDbHelper
于 2015-12-15T00:11:08.797 回答