欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

nodejs超出最大的調(diào)用棧錯誤問題

 更新時間:2017年12月27日 10:56:46   作者:youyu歲月  
這篇文章主要介紹了nodejs超出最大的調(diào)用棧錯誤問題,需要的朋友可以參考下

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

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

程序實現(xiàn)的代碼大致如下

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);
     }
     /* 此處為對數(shù)據(jù)進行update操作 */
     // 遞歸調(diào)用modify方法 
     return modify(cursor);
   }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

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

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

代碼修改如下

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);
        }
        /* 此處對數(shù)據(jù)進行update操作 */
        // 遞歸調(diào)用modify方法 
        return setTimeout(function(){ 
              //跳出遞歸調(diào)用棧
              modify(cursor);
            },0);
      }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

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

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);
        }
        /* 此處對數(shù)據(jù)進行update操作 */
        // 遞歸調(diào)用modify方法 
        if(count%10000 === 0) {
          return setTimeout(function(){ 
              //跳出遞歸調(diào)用棧
              modify(cursor);
              },0);
        }else{
          return modify(cursor);
        }    
      }); 
    }else{
      console.log('finished');
    }
  })
}
var cursor = collection.find();
modify(cursor);

總結

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

相關文章

  • nodejs服務內(nèi)存泄露排查過程和優(yōu)化方法

    nodejs服務內(nèi)存泄露排查過程和優(yōu)化方法

    在開發(fā)和部署Node.js應用程序時,內(nèi)存泄露是一個常見的挑戰(zhàn),本文將探討如何對于一個陌生項目進行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 一文詳解Node.contain?函數(shù)兼容處理

    一文詳解Node.contain?函數(shù)兼容處理

    這篇文章主要為大家介紹了Node.contain?函數(shù)兼容處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Node處理CPU密集型任務有哪些方法

    Node處理CPU密集型任務有哪些方法

    這篇文章主要介紹了Node處理CPU密集型任務有哪些方法,Node是一個非阻塞I/O和事件驅動的JavaScript運行環(huán)境,所以它非常適合用來構建I/O密集型應用,例如Web服務等
    2022-09-09
  • node后端服務?;畹膶崿F(xiàn)

    node后端服務?;畹膶崿F(xiàn)

    這篇文章主要介紹了node后端服務?;畹膶崿F(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 使用Node.js搭建Web服務器

    使用Node.js搭建Web服務器

    這篇文章介紹了使用Node.js搭建Web服務器的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 在Mac下徹底卸載node和npm的方法

    在Mac下徹底卸載node和npm的方法

    今天小編就為大家分享一篇在Mac下徹底卸載node和npm的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 理解nodejs的stream和pipe機制的原理和實現(xiàn)

    理解nodejs的stream和pipe機制的原理和實現(xiàn)

    本篇文章主要介紹了理解nodejs的stream和pipe機制的原理和實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Node.js中操作MongoDB的CRUD操作指南

    Node.js中操作MongoDB的CRUD操作指南

    在Node.js中操作MongoDB常見的庫有mongodb原生驅動和mongoose等,本文將使用mongodb官方驅動包來進行示例,在開始之前,請確保已經(jīng)安裝了MongoDB數(shù)據(jù)庫并且在本地啟動了MongoDB服務,需要的朋友可以參考下
    2024-01-01
  • 學習使用ExpressJS 4.0中的新Router的用法

    學習使用ExpressJS 4.0中的新Router的用法

    ExpressJS 4.0中提出了新的路由Router,提供了路由應有的API,本文詳細的介紹了ExpressJS 4.0中的新Router的用法,非常具有實用價值,需要的朋友可以參考下
    2018-11-11
  • Node升級后vue項目node-sass報錯問題及解決

    Node升級后vue項目node-sass報錯問題及解決

    這篇文章主要介紹了Node升級后vue項目node-sass報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論