【问题标题】:Insert 500k records in mongodb one by one causes heap out of memory在mongodb中插入500k条记录导致堆内存不足
【发布时间】:2019-10-01 13:48:02
【问题描述】:

我正在尝试在 mongodb 中插入 500 000 条记录 收藏。这些值存储在 csv 中并进行解析,然后存储到数组中。并使用递归函数一一插入记录,当再次插入一条记录时,调用相同的函数。 此过程适用于 200 000 条记录,但当记录大小增加超过 200 000 条时,它会导致堆内存不足(JS 堆栈跟踪)。

下面是我正在使用的递归函数

function insertMongoSingle(fileRows, x, total){
    if(x < total){
        let item = fileRows.shift();
        let record  = new Record({i:item}, false);
        record.save(function(error, contact){
            if(error){
                console.log(error);
                x++;
                insertMongoSingle(fileRows, x ,total);
            }else{
                x++;
                insertMongoSingle(fileRows, x, total);
            }
        }); 
    }else{
        console.log('completed');
    }
}

其中 x 是计数,fileRows 是对象数组中的总记录,total 是 fileRows 的长度

【问题讨论】:

  • 总只是 fileRows.length?你能展示产生fileRows的函数吗,在1个数组中有500,000个项目效率很低,而且会有更好的方法。
  • 不能分块读取数据并处理吗?

标签: javascript node.js mongodb express mongoose


【解决方案1】:

我建议使用 bulk insert mongo 功能。

stackoverflow上已经给出了详细答案:Inserting a big array of object in mongodb from nodejs

或者,如果您想要其他解决方案,您可以查看我的加载示例: Loading 10K of seed data

【讨论】:

    【解决方案2】:

    您不能选择使用命令行导入 CSV 数据吗?如果你有这可能是使用mongoimport 的更好选择。如果不是这样,并且想要在保存到数据库之前解析和自定义数据,那么请使用 CSV 流解析器。分批收集和处理记录。假设每个批次有 5000 条记录,用 `Model.insertMany(records) 插入每个批次,刷新它并创建一个新批次,处理并重复直到完成所有批次(记录)。

    mongoimport

     mongoimport -d dbname -c collectionName --type csv --file input.csv --headerline
    

    以编程方式:

    const csv = require('fast-csv');
    const fs =   require('fs')
    let records = [];
    let limits = 5000
    fs.createReadStream('my.csv')
        .pipe(csv.parse({ headers: true}))
        .on('error', error => console.error(error))
        .on('data', row => {
             // customize your data here 
            records.push(row);
           if(recors.legth==limits) {
           Model.insertMany(records)
           records = [];
          }
         })
        .on('end', rowCount => {
       });
    

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2019-05-27
      • 1970-01-01
      • 2021-08-16
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      相关资源
      最近更新 更多