Node.js (0.8.18) と Mongoose (3.5.4) を使用してストア カタログを MongoDb (2.2.2) にロードしようとしています - すべて Windows 7 64 ビット上で。データ セットには、約 12,500 レコードが含まれています。各データ レコードは JSON 文字列です。
私の最新の試みは次のようになります。
var fs = require('fs');
var odir = process.cwd() + '/file_data/output_data/';
var mongoose = require('mongoose');
var Catalog = require('./models').Catalog;
var conn = mongoose.connect('mongodb://127.0.0.1:27017/sc_store');
exports.main = function(callback){
var catalogArray = fs.readFileSync(odir + 'pc-out.json','utf8').split('\n');
var i = 0;
Catalog.remove({}, function(err){
while(i < catalogArray.length){
new Catalog(JSON.parse(catalogArray[i])).save(function(err, doc){
if(err){
console.log(err);
} else {
i++;
}
});
if(i === catalogArray.length -1) return callback('database populated');
}
});
};
データベースにデータを入力しようとすると、多くの問題が発生しました。前のシナリオ (およびこのシナリオ) では、ノードはプロセッサをペグし、最終的にメモリ不足になります。このシナリオでは、Mongoose がレコードを保存できるようにし、レコードが保存されたら次のレコードに反復することに注意してください。
しかし、Mongoose 保存関数内の反復子はインクリメントされません。さらに、エラーをスローすることはありません。しかし、イテレータ (i) を Mongoose への非同期呼び出しの外に置くと、ロードしようとするレコードの数が大きすぎなければ機能します (この方法で 2,000 を正常にロードしました)。
私の質問は次のとおりです。Mongoose の保存呼び出し内のイテレータがインクリメントされないのはなぜですか? さらに重要なことに、Mongoose を使用して大規模なデータ セットを MongoDb にロードする最良の方法は何ですか?
ロブ