MongoDBサーバーをクラッシュさせることなく、多くのデータを効率的に挿入しようとしています(XMLファイルのサイズが70GBを超えています)。現在、これは私がNodeJSでxml-stream
を使用してやっているものです:私はxml.on()
を呼び出すときストリーミングされたXMLデータデータベースを挿入
var fs = require('fs'),
path = require('path'),
XmlStream = require('xml-stream'),
MongoClient = require('mongodb').MongoClient,
assert = require('assert'),
ObjectId = require('mongodb').ObjectID,
url = 'mongodb://username:[email protected]:27017/mydatabase',
amount = 0;
var stream = fs.createReadStream(path.join(__dirname, 'motor.xml'));
var xml = new XmlStream(stream);
xml.collect('ns:Statistik');
xml.on('endElement: ns:Statistik', function(item) {
var insertDocument = function(db, callback) {
db.collection('vehicles').insertOne(item, function(err, result) {
amount++;
if (amount % 1000 == 0) {
console.log("Inserted", amount);
}
callback();
});
};
MongoClient.connect(url, function(err, db) {
insertDocument(db, function() {
db.close();
});
});
});
それは基本的に私は、現在の午前ツリー/要素を返します。これはまっすぐなJSONなので、私はdb.collection().insertOne()
関数にパラメータとして渡すことができ、それをデータベースに挿入します。
すべてのコードは実際と同じように動作しますが、約3000回の挿入(約10秒かかる)後に停止します。データベース接続を開いてデータを挿入してから、XMLファイルのツリーが表示されるたびに接続を閉じる(この場合は約3000回)と思われます。
何とかinsertMany()
機能を組み込み、100s(またはそれ以上)のチャンクにすることはできますが、ストリームと非同期でどのように動作するかはわかりません。
私の質問は次のとおりです.MongoDBデータベースに多量のXMLをJSONに挿入するにはどうすればクラッシュするのですか?
ああ、男の子、それは動作するように見えます!私は基本的に自分のやることをやっていますが、オープンなつながりで周りを包み込むことはできませんでした。私の問題は、それは私に非常に矛盾した結果をもたらしたということでした。 1000レコードを挿入した場合、実際には300レコードしかデータベースに表示されません(その周りに)。おそらく、私はそれが終わる前にランダムな時間に接続を閉じるだけだからです。ありがとう、ニール! – MortenMoulder
別の注記:本当に始まる理由を知っていますか?約75000のインサートの後に遅くなりますか?私たちは、データベースが空のときは1000 /秒、75000前後のときは100〜200 /秒を話しています。 – MortenMoulder
@MortenMoulder '.insertMany()'を使って改善が見られるはずですが、スループットはデータの量によって異なりますが、まったく違った、本当に広いテーマです。索引が存在する場合、使用可能なメモリー、書き込みの分散、および基本ハードウェアなど、詳細なしに検討する要素は多すぎます。他にご質問がある場合は、[詳細を明記できる] [https://stackoverflow.com/questions/ask]にお問い合わせください。 –