私は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 を使用せずにリクエストを使用して URL に接続するだけであれば、メモリは無限に増えません。mongodb への接続が問題だと思います。
何か案は?