MongoDB bulk.execute() 执行无序插入时花费太长时间

4
我正在尝试将Google Ngrams中的弧线馈入MongoDB(版本3.2.4),但即使使用了像MBP Mid 2014,2.2 GHz Intel Core i7和16GB这样的良好配置,它仍然需要太长时间。
对于原始文件中的8.9百万行数据,我为每个创建一个doc并将其插入无序批量中bulk.insert(doc);
在插入了500个文档后,我执行bulk.execute()并重复此过程,直到所有文档都添加到数据库中。然而,由于每插入1000个文档需要超过一分钟的时间,因此我肯定没有8900多分钟等待它完成。
以下是代码:
MongoClient.connect(url, function (err, db) {
if (err) {
  console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
    //connected
    console.log('Connection established to', url);

    var bulk = db.collection('bigrams').initializeUnorderedBulkOp();

    const rl = readline.createInterface({
     input: fs.createReadStream(path+filename)
    });

    rl.on('line', function (line) {
        var stringArray = line.split("\t");
      var firstPart = stringArray[0]+'\t'+stringArray[1]+'\t'+stringArray[2]+"\t";

      var head_token = stringArray[0];
      var syntatic_ngram = stringArray[1].split(" ");
      var total_count = stringArray[2];
      var counts_by_year = line.replace(firstPart,'').split("\t");

      var doc = {
        "head token" : head_token,
        "syntatic ngram" : syntatic_ngram,
        "total count" : total_count,
        "counts by year" : counts_by_year
      };
      count++;
      bulkCount++;
      if (bulkCount == bulkSize) {
        console.log("BulkSize reached. Executing...");
        bulk.execute();
        bulkCount = 0;
      }
      console.log("bulk inserted count:"+count);
      bulk.insert(doc);
    });

    rl.on('end', function(){
      bulk.execute();
        db.close();
    });

  }
});

P.S.: 前10k次插入, 即前20个 bulk.execute() 的处理速度非常快,小于1分钟。之后处理时间会逐渐增加。有任何建议吗?谢谢。


请在您的帖子中提到MongoDB版本、硬件配置和MongoDB数据库类型。 - Saleem
你是否为该集合设置了其他索引? - woozyking
代码是我所做的一切。实际上,我只是在插入弧线。构建数据库后,我将处理索引。 - Lucas Azevedo
1个回答

1
我从mongoDB 文档 中得到了答案:“执行后,您不能重新执行Bulk()对象而不重新初始化。”
我刚刚在bulk.execute();之后添加了bulk = db.collection('bigrams').initializeUnorderedBulkOp();,插入时间保持恒定。几分钟后,所有内容都被插入。
希望这能帮助其他人。(:

你能描述一下将你的数据分块的性能提升吗?如果有的话。 - gen
@gen 没有注意到任何问题。 - Lucas Azevedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接