JSON の REST インターフェイス経由でエクスポートしたい mongodb にユーザー データベースがあります。問題は、最悪のシナリオでは、返される行の量が 200 万をはるかに超えることです。
最初にこれを試しました
var mongo = require('mongodb'),
Server = mongo.Server,
Db = mongo.Db;
var server = new Server('localhost', 27017, {auto_reconnect: true});
var db = new Db('tracking', server);
var http = require('http');
http.createServer(function (request, response) {
db.collection('users', function(err, collection) {
collection.find({}, function(err, cursor){
cursor.toArray(function(err, items) {
output = '{"users" : ' + JSON.stringify(items) + '}';
response.setHeader("Content-Type", "application/json");
response.end(output);
});
});
});
}).listen(8008);
console.log('Server running at localhost:8008');
メモリが不足すると失敗します。この例では、node-mongodb-native ドライバーと基本的な http パッケージを使用しています。
致命的なエラー: CALL_AND_RETRY_2 割り当てに失敗しました - プロセスがメモリ不足です
(実際のシナリオでは、必要に応じて結果を制限するパラメーターを使用しますが、この例ではそれらすべてをクエリしますが、これは最悪のシナリオです)
データ自体は単純です。
{ "_id" : ObjectId("4f993d1c5656d3320851aadb"), "userid" : "80ec39f7-37e2-4b13-b442-6bea57472537", "user-agent" : "Mozilla/4.0 (互換性あり; MSIE 8.0; Windows NT 5.1; Trident/ 4.0; .NET CLR 1.1.4322)"、"ip": "127.0.0.1"、"lastupdate": 1335442716 }
私も次のようなことを試しました
while(cursor != null)
{
cursor.nextObject(function(err, item) {
response.write(JSON.stringify(item));
});
}
しかし、それもメモリを使い果たしました。
どのように進めればよいですか?行ごとにデータをストリーミングする方法があるはずですが、適切な例を見つけることができませんでした。外部アプリケーションの要件があるため、データのページングは問題外です。データをファイルに書き込んでから投稿することを考えましたが、それは不要な io につながります。