[英]Insert 500k records in mongodb one by one causes heap out of memory
[英]How to download whole collection with more than 500k records as csv with nodejs from mongodb?
我已經使用名為json2csv的npm包嘗試過此操作。 對於多達75,000條的記錄,它工作正常。當數據超過該值時,我沒有從回調函數exporttocsv獲得任何響應,如下所示。
const json2csv = require('json2csv').parse;
var today = new Date();
var mongoClient = require('mongodb').MongoClient
, assert = require('assert');
var dd = today.getDate();
var mm = today.getMonth() + 1; //January is 0!
var yyyy = today.getFullYear();
if (dd < 10) {
dd = '0' + dd;
}
if (mm < 10) {
mm = '0' + mm;
}
var today = dd + '_' + mm + '_' + yyyy;
router.put('/mass_report', (req, res) => {
mass_data_download();
res.json("Mass report download initiated");
});
function exporttocsv(data,name, callback) {
/* Start: Json to xlsx conversion */
if (!fs.existsSync('./csv/'+today+'/')) {
fs.mkdirSync('./csv/'+today+'/');
}
var csv = json2csv(data);
var fname = './csv/'+today+'/' +name+ new Date().getTime() + '.csv';
fs.writeFileSync(fname, csv, 'binary',(error,response)=>{
console.log(error);
console.log(response);
});
callback(fname);
}
function mass_data_download(){
db.collection('mass_data').aggregate([
{$match:{
created_on: {
$gte: new Date("2017-09-01T00:00:00.000Z"),
}
}}
]).sort({_id:-1}).toArray( function (error, response) {
if(error){
console.log(error)
}
else{
console.log(response.length);
exporttocsv(response,'mass_report', function (fname) {
console.log('reports download complted');
})
}
})
}
將數據導出到CSV時有什么限制嗎? 或如何通過其他替代方式實現這一目標?
問題是您正在同時處理內存中的大量數據。 您應該不惜一切代價避免使用它。 Node.js非常適合使用流,搭載在其上。 將Mongo視為您的可讀流,然后將其通過管道傳輸到json2csv轉換流,然后對結果進行所需的操作,也許您希望將其通過管道傳輸到可寫流,例如文件甚至http響應。
貓鼬支持流媒體。 您可以在這里找到更多信息json2csv還支持流接口。 這里是有關json2csv流API的更多信息。
UPDATED :最終偽代碼應類似於:
const csv = fs.createWriteStream('file.csv');
Model.find()
.cursor() // read more [here][1]
.pipe(json2csvTransformStream) // read more in json2csv transform stream API
.pipe(csv); // read more in fs.createWritableStream
管道將處理所有流,並且您不必擔心內存泄漏或性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.