2013-04-29 73 views
1

這是我第一個問題,堆棧溢出,但我一直在使用SO過去2年,它提供了豐富的信息。使用Node.js的大量數據加載

我最近拿起NodeJS,我遇到了困境。我試圖找出使用NodeJS加載/插入大約2000行數據的最佳方法,並且如果可能的話使用首選的異步方法。我必須從API中獲取數據,然後獲取JSON數據並將數據加載到3個表中,以便稍後使用這些數據。該文件有17個國家對象,77個國家對象和約2000個縣對象。

,我解析

的JSON文件格式爲:

[{Country:{ 
    Name: ... 
    CountryId: ... 
    States: { 
     Name: ... 
     StateId: ... 
     Counties: { 
     Name: ... 
     CountyId:... 
     } 
    } 
    },{Country+n:{ 
    Name: ... 
    CountryId: ... 
    States: { 
     Name: ... 
     StateId: ... 
     Counties: { 
     Name: ... 
     CountyId:... 
     } 
    } 
    }]; 
與我的PHP底色

所以,我會立刻在JavaScript創建三個功能,例如:

function Country(data){ 
    for(var z in data){ 
     var country = data[z]; 
     InsertInCountryDB(country.CountryId, country.Name); 
     State(Country.State); 
    } 
} 

    function State(data){ 
     for(var z in data){ 
      var state = data[z]; 
      InsertInStateDB(state.StateId, state.Name); 
      State(Country.State); 
     } 
    } 

    function County(data){ 
     for(var z in data){ 
      var county = data[z]; 
      InsertInCountyDB(county.CountyId, county.Name); 
     } 
    } 

我第一次嘗試已經爲每個對象創建一個事件,然後使用這些事件深入到自己內部的對象中,然後插入數據。我發現將國家和州的詳細信息插入到數據庫中效果很好,但是縣數據會出錯。

我不是在尋找我的問題的答案,而是一個編碼技巧,以幫助我擺脫我的三個同步功能,而是使用異步功能。

謝謝

+0

哪個數據庫?你有什麼嘗試? EventEmitters?回調? – TheHippo 2013-04-29 04:16:44

+0

2000行應該非常快。我已經寫了腳本插入從多個文件mongo 7毫米記錄沒有問題在異步。那麼你使用什麼數據庫? – wayne 2013-04-29 06:25:17

+0

我正在使用postgres數據庫。我使用了EventEmitters,但是我今天早上在想,我可能錯過了最初使用Listener和事件的方式。我設法使用同步方法將所有數據導入系統。但NodeJS的重點是異步編程,所以我想看看我是否可以重寫代碼以使用更好的方法。 – LorneCurrie 2013-04-30 03:01:59

回答

0

2000應該不會太差。這聽起來像更像10000插入左右的東西。你的大規則是把它們作爲一個單獨的提交(如果你可以做準備好的語句,甚至更好),並在最後提交。因爲你的問題更多的是在體系結構方面,並且假設你使用的是PostgreSQL 9.1或更高版本(並且可以從源代碼安裝額外的編譯後擴展),所以我的建議會大不相同。

我會創建一個臨時表(如果需要從9.1源的擴展名):

CREATE TEMPORARY TABLE upload_holding (payload json); 

那我就只需插入在那裏的「行」爲JSON文件。然後,我會在plv8js中編寫一個存儲過程(您必須單獨安裝,可能來自源代碼,但如果您不想使用Javascript,則可以使用pl/perl),它將處理JSON並提取每個碎片。然後,您可以將這些功能鏈接在一起,以便將這些行作爲集合進行處理並將它們一起插入。

一個完整的工作示例在這裏並不是真的可行,但考慮到使用Perl或Javascript,您可以將每個實體以JSON形式提取到一個元組中,然後取出該元組並進一步處理它,將插入鏈接到數據庫內的JSON處理。

除非您的大部分功能都在數據庫中,否則這將是相似的,因此需要少得多的計劃開銷纔能有效利用。