我试图有效地插入大量的数据(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),您可以清楚地表达详细信息。 –