2014-06-11 32 views
0

假設我想生成一百萬條記錄並將它們插入數據庫。如果需要一個小時,沒問題。當向數據庫插入大量記錄時,如何編寫節點腳本以減少內存使用量?

我已經得到了生成假的零售數據庫:

var records = retailGen.generateOrders(numberOfRecords);

確定這是沒有問題的,它可以產生一百萬條記錄相當迅速。當我排隊了大量的記錄,並遍歷這些問題就來了(每個記錄包含一個或多個事務,insertTransaction是一個異步調用DB):

_fn = function(record) { 
    var transaction, _j, _len, _ref, _results; 
    _ref = record.transactions; 
    for (_j = 0, _len = _ref.length; _j < _len; _j++) { 
     transaction = _ref[_j]; 
     insertTransaction(transaction); 
    } 
    }; 

    for (n = _i = 0; 0 <= runs ? _i < runs : _i > runs; n = 0 <= runs ? ++_i : --_i) { 
    _fn(records[n]); 
    } 

它就會堆積所有這些異步調用了並淹沒內存,最終導致操作系統癱瘓,以至於我無法做任何事情。我想知道更多有經驗的js程序員如何解決這個問題。該腳本有效,但數量變大時效果不佳。

我寧願用純js而不是圖書館來解決這個問題 - 這將是一個更好的學習體驗。我考慮將下一個記錄的插入插入到第一個插入的「完成」回調中,但接下來感覺就像是強制節點是同步的(很好,非常同步)。

回答

0

當我插入「硬採集」大數據量首先我傾向於給他們一個PHP scipt,大塊成爲甚至部分,並將其放入一個文件。

現在這可能聽起來浪費資源,但你幾乎不會出錯序列化數據。因此,直到這一點,沒有什麼可以打破。我假設收集大量的數據,你可能會得到意想不到的「事情」。

比我逐行獲取序列化文件,反序列化並插入它。

如果有什麼應該在中間斷開:我有數據重現錯誤,並且不會發生數據丟失。

我可以睡覺tospare CPU,限制塊中的數據量。

這就是我如何去做的。

+0

是的,這與我所做的相似:我只是在bash腳本中放置一個循環並調用節點腳本。不喜歡這個解決方案,覺得我應該能夠做得更好。 – jcollum

+0

更快更快或者你的意思是?你更好的目標是什麼? – Sesertin

+0

不訴諸bash腳本等我想知道如何做這種節點的速率限制。 – jcollum

相關問題