我試圖有效地插入大量的數據(XML文件超過70GB的大小)沒有崩潰我的MongoDB服務器。目前,這就是我在使用的NodeJS做xml-stream
:流插入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();
});
});
});
當我打電話xml.on()
它基本上返回樹/元素,我目前。由於這是JSON的直線,所以我可以將它作爲參數提供給我的db.collection().insertOne()
函數,並將其按照我的需要插入到數據庫中。
所有代碼的實際工作,因爲它是現在,但經過約3000插入停止(約需10秒)。我懷疑這是因爲我打開數據庫連接,插入數據,然後每次在XML文件中看到一棵樹時都關閉連接,在這種情況下,大約有3000次。
我可以在某種程度上將insertMany()
函數合併爲100個(或更多)的塊,但我不太確定這將如何處理這一切,這些工作都是流式傳輸和異步處理。
所以我的問題是:如何插入大量XML(以JSON)到我的MongoDB數據庫沒有它崩潰?
哦,男孩,它看起來像它的作品!我試圖基本上按照自己的意願做出自己的決定,但我無法打開我的頭。我的問題是,它給了我非常不一致的結果。如果我插入1000條記錄,它實際上只會在數據庫中顯示300條記錄(大約在那)。可能是因爲我只是在完成之前隨機關閉連接。非常感謝,尼爾! – MortenMoulder
另一個說明:你有任何線索,爲什麼它開始真正去!大約75000插入後緩慢?當數據庫爲空時,我們正在談論1000/sec,但是當我達到75000時,可能是100-200/sec。 – MortenMoulder
@MortenMoulder使用'.insertMany()'可以看到顯着的改進,但對於吞吐量取決於有多少數據,這是一個完全不同而且非常廣泛的主題。沒有具體細節就需要考慮太多的因素,比如什麼索引(如果有),可用內存,寫入分配和基本硬件。如果您有其他問題,通常最好[提出新問題](https://stackoverflow.com/questions/ask),您可以清楚地表達詳細信息。 –