国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

nodejs超出最大的調用棧錯誤問題

2024-05-06 16:41:39
字體:
來源:轉載
供稿:網友

今天早上老大和我說之前項目里面的那個數據要改動,要對 mongodb 中每條記錄進行 update 操作,你寫個腳本跑一下吧。

然后,我默默的回到電腦前,努力工作的一天又開始了。由于此表數據量有點略大,該有一千多萬條記錄。所以考慮使用 mongodb 的 cursor 游標來進行遍歷修改。

程序實現的代碼大致如下

function modify(cursor) {  cursor.hasNext(function(err,bool) {   if(err) {      return console.log(err);     }     if(bool) {      cursor.next(function(err, item){       if(err) {       return console.log(err);     }     /* 此處為對數據進行update操作 */     // 遞歸調用modify方法      return modify(cursor);   });     }else{      console.log('finished');    }  })}var cursor = collection.find();modify(cursor);

然后讓它慢慢跑吧,可是一個令我郁悶的事情發生了。當游標跑到接近500萬的時候,程序崩了,提示Uncaught RangeError: Maximum call stack size exceeded

竟然告訴我爆棧了,什么情況? 哎,排查代碼,開始填坑。發現我上面遞歸調用了modify() ,而且遞歸次數有點小多(1000多萬條記錄的表啊),可能是函數不斷的遞歸調用導致它的調用棧不斷的增加,然后越來越大,最終就沒有然后了,爆棧了。看來得給個機會讓node進行垃圾回收一下,要想讓它有機會垃圾回收那就只得終結一下遞歸啊。使用系統的setTimeout();來跳出遞歸調用棧吧。

代碼修改如下

function modify(cursor) {   cursor.hasNext(function(err,bool) {    if(err) {      return console.log(err);     }    if(bool) {            cursor.next(function(err, item){        if(err) {          return console.log(err);        }        /* 此處對數據進行update操作 */        // 遞歸調用modify方法         return setTimeout(function(){               //跳出遞歸調用棧              modify(cursor);            },0);      });     }else{      console.log('finished');    }  })}var cursor = collection.find();modify(cursor);

在跑一下試試。。。。ok,好使了。但是運行有點慢啊,因為我每次都讓它跳出遞歸調用棧了。這樣雖然沒問題但是沒必要,因為400多萬才會出現爆棧呢。加個計數器吧,等調用棧有點大的時候在跳出來。

var count = 0;function modify(cursor) {   count++;  cursor.hasNext(function(err,bool) {    if(err) {      return console.log(err);     }    if(bool) {      cursor.next(function(err, item){        if(err) {         return console.log(err);        }        /* 此處對數據進行update操作 */        // 遞歸調用modify方法         if(count%10000 === 0) {          return setTimeout(function(){               //跳出遞歸調用棧              modify(cursor);              },0);        }else{          return modify(cursor);        }          });     }else{      console.log('finished');    }  })}var cursor = collection.find();modify(cursor);

總結

以上所述是小編給大家介紹的nodejs超出最大的調用棧錯誤問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!

 

注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福州市| 金坛市| 保亭| 聂拉木县| 湟源县| 井冈山市| 七台河市| 丹阳市| 丹棱县| 长治县| 右玉县| 兴安县| 贺兰县| 思茅市| 乌鲁木齐县| 双流县| 田东县| 彩票| 佛学| 赤城县| 根河市| 邹平县| 黔江区| 丹凤县| 长治县| 普兰县| 济南市| 通江县| 建宁县| 渑池县| 衡阳县| 牙克石市| 临高县| 开封市| 磐石市| 苗栗市| 博兴县| 皮山县| 盐津县| 左云县| 卓尼县|