gpt4 book ai didi

node.js - 为什么我的 nodejs 插入到 mongoDB 会在一段时间后停止

转载 作者:可可西里 更新时间:2023-11-01 09:56:15 25 4
gpt4 key购买 nike

我正在使用以下代码测试我的 nodejs 插入到我的 MongoDB 中。当我插入 10000 行之类的内容时,一切正常。但是如果我尝试插入 100 万之类的东西,插入操作会停止一段时间,nodejs 控制台和 MongoDB 上都不会打印出任何错误。

我在下面附上了我的代码和 MongoDB 的控制台,请帮助我,非常感谢!!

---更新---

为了从回复中回答问题,我还检查了我的 mongostat,然后插入停止了。但是,我观察到两种现象:

观察结果:insert正在进行,mongostat显示,大部分时间insert为0,但有时也能显示插入的记录。

2) 在我的 PC 上,通过“npm --registry http://registry.npmjs.eu/ install mongodb”安装 mongodb 解析器,“node my.js”启动时输出以下服务器输出“服务器已启动。-> 失败加载 c++ bson 扩展,使用纯 JS 版本"

观察结果:insert只跑了一会儿,然后什么都没发生,过一会儿mongostat显示insert一直为零。

“npm --registry http://registry.npmjs.eu/ install mongodb”也会有问题吗?


我的 nodejs 代码:

mongoClient.connect("mongodb://localhost:27017/testdb", { db : { native_parser : true } }, function(err, database) {

if (err) { console.log(err.message); throw err; }

// create new collection under database
var collection = database.collection('gm_std_measurements_coveringindex');
date = new Date();

// add all Documents
for (var i = 0; i < 1000000; i++) {
var ranNumber = Math.floor((Math.random() * 1000) + 1);

// insert objects after table and index creation
var istObject = {
fkDataSeriesId : ranNumber,
measDateUtc : date,
measDateSite : date,
project_id : ranNumber,
measvalue : ranNumber,
refMeas : false,
reliability : 1.0
};

collection.insert(istObject, { w : 1 }, function(err, docs) {
if (err) {
console.log(err.message);
throw err;
} else {
// do noting to responsed inserted Document
}
});
}
console.log("* Documents created!");
});

MongDB 服务器输出:

Thu Apr 17 15:32:18.942 [initandlisten] connection accepted from 127.0.0.1:33228 #70 (3 connections now open)
Thu Apr 17 15:32:18.949 [conn70] end connection 127.0.0.1:33228 (2 connections now open)
Thu Apr 17 15:32:18.951 [initandlisten] connection accepted from 127.0.0.1:33229 #71 (3 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33230 #72 (4 connections now open)
Thu Apr 17 15:32:18.952 [initandlisten] connection accepted from 127.0.0.1:33231 #73 (5 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33232 #74 (6 connections now open)
Thu Apr 17 15:32:18.953 [initandlisten] connection accepted from 127.0.0.1:33233 #75 (7 connections now open)
Thu Apr 17 15:32:28.520 [FileAllocator] allocating new datafile /var/lib/mongodb/testdb.2, filling with zeroes...
Thu Apr 17 15:32:28.563 [FileAllocator] done allocating datafile /var/lib/mongodb/testdb.2, size: 256MB, took 0.042 secs
Thu Apr 17 15:32:31.517 [conn75] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:23 129ms
Thu Apr 17 15:32:31.517 [conn72] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:37 129ms
Thu Apr 17 15:32:31.517 [conn74] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:31 129ms
Thu Apr 17 15:32:31.517 [conn73] insert testdb.gm_std_measurements_coveringindex ninserted:1 keyUpdates:0 locks(micros) w:19 129ms

最佳答案

我想我自己已经弄明白了。

从Nodejs向MongoDB插入百万条数据的问题在于,nodejs忙于生成这些记录并立即发送出去。百万条数据立即出现,nodejs自己卡了一会就卡住了,这时候MongoDB还没有收到多少insert。

我通过设置一次插入 10000 条记录的间隔方法来“摆脱”这个问题,并每秒调用这个间隔,以便 nodejs 有机会移动到下一个事件将生成的 insert 发送出去,然后再次开始生成 insert。

interval_checkId = setInterval(createSomeInsert, 1000);

还有 createSomeInsert 方法:

function createSomeInsert() {

console.log("* Starting to insert another 10K records, current count: " + counter);

var collection = dbPool.collection('gm_std_measurements_coveringindex');

var date = new Date();
var amount = 10 * 1000;
for(var i = 0; i < amount; i++) {

var ranNumber = Math.floor((Math.random() * 1000) + 1);

// insert objects after table and index creation
var istObject = {
fkDataSeriesId : ranNumber,
measDateUtc : date,
measDateSite : date,
project_id : ranNumber,
measvalue : ranNumber,
refMeas : false,
reliability : 1.0
};

collection.insert(istObject, { w : 0 }, function(err, docs){
if(err) {console.log(err); throw err;}
counter++;
});

}

if(counter >= totalTarget) {
clearInterval(interval_checkId);
console.log("Completed Insert, in total : " + counter);
counter = 0;
}
}

但是我还是不明白为什么nodejs在产生很多insert请求后会被阻塞,为什么大部分没有在后台发送给mongodb。

关于node.js - 为什么我的 nodejs 插入到 mongoDB 会在一段时间后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23134624/

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