最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

程序?qū)崿F(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進行垃圾回收一下,要想讓它有機會垃圾回收那就只得終結(jié)一下遞歸啊。使用系統(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);

總結(jié)

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

相關(guān)文章

  • node使用async_hooks模塊進行請求追蹤

    node使用async_hooks模塊進行請求追蹤

    這篇文章主要介紹了node使用async_hooks模塊進行請求追蹤,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 簡單實現(xiàn)node.js圖片上傳

    簡單實現(xiàn)node.js圖片上傳

    這篇文章主要為大家詳細介紹了node.js圖片上傳的簡單實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • NodeJS學習筆記之Connect中間件模塊(二)

    NodeJS學習筆記之Connect中間件模塊(二)

    本文續(xù)上文的內(nèi)容,介紹下nodejs中connect中間件的使用方式及用途,希望大家喜歡。
    2015-01-01
  • Node.js中多進程模塊Cluster的介紹與使用

    Node.js中多進程模塊Cluster的介紹與使用

    眾所周知Node.js是單線程的,一個單獨的Node.js進程無法充分利用多核。Node.js從v0.6.0開始,新增cluster模塊,讓Node.js開發(fā)Web服務時,很方便的做到充分利用多核機器。這篇文章主要給大家介紹了關(guān)于Node.js中多進程模塊Cluster的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Node.js中HTTP模塊與事件模塊詳解

    Node.js中HTTP模塊與事件模塊詳解

    這篇文章主要詳細介紹了Node.js中HTTP模塊與事件模塊的相關(guān)資料,需要的朋友可以參考下
    2014-11-11
  • Node.js返回JSONP詳解

    Node.js返回JSONP詳解

    下面小編就為大家?guī)硪黄狽ode.js返回JSONP詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 詳解如何在vscode里面調(diào)試js和node.js的方法步驟

    詳解如何在vscode里面調(diào)試js和node.js的方法步驟

    這篇文章主要介紹了詳解如何在vscode里面調(diào)試js和node.js的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Express使用multer實現(xiàn)文件上傳的示例代碼

    Express使用multer實現(xiàn)文件上傳的示例代碼

    這篇文章主要介紹了Express 使用 multer 實現(xiàn)文件上傳的操作步驟,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • NodeJs?Express路由使用流程解析

    NodeJs?Express路由使用流程解析

    路由路徑和請求方法一起定義了請求的端點,它可以是字符串、字符串模式或者正則表達式。后端在獲取路由后,可通過一系列類似中間件的函數(shù)去執(zhí)行事務
    2023-01-01
  • Nodejs學習筆記之測試驅(qū)動

    Nodejs學習筆記之測試驅(qū)動

    本文是本系列文章的第二篇,主要是測試針對于web后端的驅(qū)動,在開發(fā)過程中,在開發(fā)完成一段代碼后如果負責任而不是說完全把問題交給測試人員去發(fā)現(xiàn)的話,這個時候通常都會去做一些手動的測試。
    2015-04-04

最新評論

巩义市| 苏尼特右旗| 法库县| 资溪县| 桐乡市| 永定县| 丹江口市| 随州市| 西藏| 新巴尔虎左旗| 自贡市| 开阳县| 黄平县| 莲花县| 浮山县| 呼玛县| 布尔津县| 海淀区| 泾阳县| 大化| 喀喇沁旗| 会东县| 泸州市| 盱眙县| 福海县| 龙井市| 阿拉善左旗| 静海县| 湖口县| 渭源县| 将乐县| 班玛县| 绥芬河市| 麻栗坡县| 山东省| 陆良县| 林西县| 佛山市| 渝中区| 潜山县| 谷城县|