Javascript 在mongodb中逐个插入500k记录会导致堆内存不足

Javascript 在mongodb中逐个插入500k记录会导致堆内存不足,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在尝试在mongodb中插入500000条记录 收集这些值存储在csv中并进行解析,然后存储到数组中。使用递归函数逐个插入记录,当再次插入一条记录时,调用相同的函数。 此过程适用于200000条记录,但当记录大小增加到200000条以上时,会导致内存堆耗尽(JS堆栈跟踪) 下面是我正在使用的递归函数 function insertMongoSingle(fileRows, x, total){ if(x < total){ let item = fileRows

我正在尝试在mongodb中插入500000条记录 收集这些值存储在csv中并进行解析,然后存储到数组中。使用递归函数逐个插入记录,当再次插入一条记录时,调用相同的函数。 此过程适用于200000条记录,但当记录大小增加到200000条以上时,会导致内存堆耗尽(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');
    }
}
function insertMongoSingle(文件行,x,总计){
如果(x
其中x是计数,fileRows是对象数组中的总记录,total是fileRows的长度

我建议使用mongo功能

关于stackoverflow,已经给出了详细的回答:

或者,如果您需要其他解决方案,可以查看我的加载示例:

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

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 => {
   });

总数是否仅为fileRows.length?你能展示一下生成文件行的函数吗,在一个数组中有500000个项目是非常低效的&有更好的方法。你不能读取数据块并进行处理吗?