【发布时间】:2017-08-05 22:48:48
【问题描述】:
我正在尝试有效地插入大量数据(XML 文件大小超过 70GB),而不会使我的 MongoDB 服务器崩溃。目前这就是我在 NodeJS 中使用 xml-stream 所做的事情:
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:password@my.server: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 数据库中而不会崩溃?
【问题讨论】:
标签: javascript node.js xml mongodb