gpt4 book ai didi

performance - mongodb 插入时 Node 应用程序不工作

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:34 25 4
gpt4 key购买 nike

我仍在学习 mongodb 和 node.js。

我试图插入大量数据,例如 100k 行和 80-100 列。我为此使用express.js 创建了一个应用程序。我以这样的方式进行编码,一旦单击上传按钮,页面就会重定向到另一个页面,并且应用程序在后台将数据插入数据库。

问题是一旦插入开始,应用程序就会停止响应。即使插入完成后,应用程序也会变慢约2-3分钟。

我尝试过这段代码

1

  • Fedora 14
  • 英特尔 P4 2.80GHz
  • 1.5GiB

2

  • Fedora 14
  • i3 3.20GHz
  • 3GiB

如何避免这个问题?它会在更好的系统上运行得更好吗?

存储数据的代码

MongoClient.connect(MONGODB_URI, function (err, database) {
var collection = database.collection(collectionName);
for (index = 0; index < jsonResult.length; ++index) {
var obj = jsonResult[index];
for (var prop in obj) {
if (headers[prop] == 'Date') {
obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"));
} else if (headers[prop] == 'Integer') {
obj[prop] = parseInt(obj[prop]);
} else if (headers[prop] == 'Float') {
obj[prop] = parseFloat(obj[prop]);
}
}
collection.insert(obj, function (err, result) {
if (err) {
console.log(JSON.stringify(err));
}
});
}
});

注意:

  • jsonResult 是读取文件(csv)并转换的结果转换为 json
  • headers 是一个具有键数据类型映射的对象

    var header = { '碘酸盐': '日期', 'sno': '整数', “工资”:“ float ”}

读取 csv 并将其转换为 json 的代码

var cv_json = require('convert-json'); // required module convert-json (convert-csv,xls,xlsx into json)
cv_json({
input: target_path,
output: null
}, function (err, result) {
if (err) {
console.error(err);
} else {
persists(req, res, result, collectionName, headers); //Function where insert takes place.
}
})

最佳答案

现在,“persists()”立即返回,即使插入尚未完成。这是由于 javascript/nodejs 的异步性质造成的。

您需要序列化插入操作,这样就不会阻塞服务器。使用 async.eachSeries()

你的“persists”函数应该使用回调来通知调用者它已经完成。像这样的事情:

persists(req, res, result, collectionName, headers, callback){
MongoClient.connect(MONGODB_URI, function (err, database) {
var collection = database.collection(collectionName);
async.eachSeries(jsonResult,
function(obj, cb){
for (var prop in obj) {
if (headers[prop] == 'Date') {
obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/,"$2/$1/$3"));
} else if (headers[prop] == 'Integer') {
obj[prop] = parseInt(obj[prop]);
} else if (headers[prop] == 'Float') {
obj[prop] = parseFloat(obj[prop]);
}
}
collection.insert(obj, function (err, result) {
cb(err);
});
},
function(err){
callback();
}
);
});
}

然后使用它

persists(req, res, result, collectionName, headers, function(){
console.log("insert finished");
});

关于performance - mongodb 插入时 Node 应用程序不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com