Javascript 在mongodb中逐个插入500k记录会导致堆内存不足
我正在尝试在mongodb中插入500000条记录 收集这些值存储在csv中并进行解析,然后存储到数组中。使用递归函数逐个插入记录,当再次插入一条记录时,调用相同的函数。 此过程适用于200000条记录,但当记录大小增加到200000条以上时,会导致内存堆耗尽(JS堆栈跟踪) 下面是我正在使用的递归函数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
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个项目是非常低效的&有更好的方法。你不能读取数据块并进行处理吗?