我正在尝试流式传输XML文件并处理数据。问题是:文件大小为70千兆字节。我有一个运行xml-stream
的NodeJS应用程序,它运行XML,获取500-1000条记录,将它们作为JSON(xml-stream的输出)处理,然后将它们转储到MongoDB数据库中。有大约900万条记录,这个过程大约需要4-5个小时,在台式机上使用xml-stream,配备i7 6700k超频,RAID 0固态硬盘和32GB内存。如果我改为cat
该文件,将其输入grep
并抓取所有树(只有1行),我可以在几分钟内处理该文件。
cat and grep命令:
cat motorregister.xml | grep "ns:KoeretoejIdent"
这是我的xml-stream代码:
var fs = require('fs'),
path = require('path'),
XmlStream = require('xml-stream'),
MongoClient = require('mongodb').MongoClient,
url = 'mongodb://username:password@123.123.123.123:27017/database',
amount = 0;
MongoClient.connect(url, function(err, db) {
var stream = fs.createReadStream(path.join(__dirname, 'motorregister.xml'));
var xml = new XmlStream(stream);
var docs = [];
// This is your event for the element matches
xml.on('endElement: ns:Statistik', function(item) {
docs.push(item); // collect to array for insertMany
amount++;
if ( amount % 1000 === 0 ) {
xml.pause(); // pause the stream events
db.collection('vehicles').insertMany(docs, function(err, result) {
if (err) throw err;
docs = []; // clear the array
xml.resume(); // resume the stream events
});
console.log("Inserted", amount);
}
});
// End stream handler - insert remaining and close connection
xml.on("end",function() {
if ( amount % 1000 !== 0 ) {
db.collection('vehicles').insertMany(docs, function(err, result) {
if (err) throw err;
db.close();
});
} else {
db.close();
}
});
});
它基本上是做什么的:它流式传输XML并解析树,然后将它们转换为JSON,并将其转换为JSON。考虑到有900万条记录,我可以做到每秒大约500次,这非常慢。
有没有更快的方法,使用Java,C#,C,Python等,可以处理像这样的大文件?我不在乎数据是JSON。只要我可以用解析后的数据创建自己的对象,那对我来说就足够了。
编辑:我现在尝试过多种不同的东西,比如gzip和bzip,但它们比简单grep
ping文件慢得多。我确实节省了空间,所以我不需要放置70GB的文件。
但是,我仍然非常迷失。