流式传输和解析XML的方式比使用xml-stream更快?

时间:2017-08-08 10:14:17

标签: c# json node.js xml mongodb

我正在尝试流式传输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的文件。

但是,我仍然非常迷失。

0 个答案:

没有答案