2014-03-12 49 views
1

我還在學習mongodb和node.js.當mongodb插入時,節點應用程序不工作

我試圖插入大量的數據說100k行與80-100列。我爲此創建了一個使用express.js的應用程序。我編碼的方式是一旦上載按鈕被點擊後頁面重定向到另一個頁面,在後臺應用程序將數據插入到數據庫中。

問題是,一旦插入開始應用程序停止響應。即使插入完成後,應用程序的運行速度也會變慢2-3分鐘左右。

我上

  • 嘗試這種代碼的Fedora 14
  • 英特爾P4 2.80GHz的
  • 1.5GiB
  • Fedora 14的
  • I3 3.20GHz
  • 3GiB

如何避免這個問題?它會在更好的系統上運行得更好嗎?

  • jsonResult是讀取一個文件(CSV)和它 轉換成JSON
  • 報頭中的結果是:用於存儲數據

    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)); 
          } 
         });  
        } 
    }); 
    

    代碼有關鍵數據類型映射的對象

    VAR頭= { '碘酸': '日期', 'SNO': '整數', '薪水': '浮動' }

代碼以讀取並轉換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. 
    } 
}) 
+0

凡'jsonResult'哪裏來的?這是讀取文件的結果。 –

+0

@NeilLunn是通過使用模塊'convert-json'讀取一個csv文件。 – Okky

+0

是的。你可以在你閱讀csv文件的地方加入你的代碼並進行轉換。所以人們可以看到你在那裏努力。有一個更好的方法來做到這一點。 –

回答

1

眼下, 「挖牆角()」 返回imidiately,即使插件還沒有完成。這是由於javascript/nodejs的異步性質。

您需要序列化插入操作,以免堵塞服務器。使用async.eachSeries()

你的「persists」函數應該使用回調來通知調用者它已完成。Somehing這樣的:

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"); 
}); 
+0

這不等待函數結束嗎?我希望插件可以在不影響應用程序的情況下在後臺運行。 – Okky

+0

你提到你使用express.js,所以我假設你有一個web應用程序。在這種情況下,由於nodejs的非阻塞性質,http調用是「一致地」執行的。 – gtsouk

+0

但仍然應用程序等待插入完成;加載另一個頁面。 – Okky

相關問題