2011-11-28 64 views
2

我從Node.js的MongoDB集合中返回一批(500k +)文檔。它不是用於在網站上顯示,而是用於數據處理。如果我抓住所有這些文件,系統就會凍結。有沒有更好的方法來抓住這一切?通過Node.js從MongoDB返回大量項目

我在想分頁可能工作嗎?

編輯:這已經是主要的node.js服務器事件循環外,所以「系統凍結」並沒有意味着「傳入的請求沒有被處理」

+0

你爲什麼需要它? Nodejs不適用於數據處理。你會考慮使用MongoDB map/reduce功能嗎? –

+0

不幸的是我們被鎖在'Node.js'中 – Shamoon

+1

除非你告訴你正在嘗試做什麼以及你現在正在做什麼,否則這是無法回答的。 – Tomalak

回答

2

學習更多關於您的情況後,我有一些想法:

  1. 做盡可能多,你可以在一個Map/Reduce function in Mongo - 也許,如果你扔在節點較少的數據,可能是解決方案。

  2. 也許這麼多的數據正在吃掉你係統中的所有內存。你的「凍結」可能是V8停止系統做垃圾回收(see this SO question)。你可以使用V8標誌--trace-gc來記錄GCs &證明這個假設。 (感謝another SO answer about V8 and Garbage collection

  3. 分頁,就像你的建議可能會有所幫助,甚至可能甚至將你的數據分割成工作隊列(創建一個引用記錄1-10的工作任務,另一個引用記錄11-20,等)取決於你的計算

  4. 也許預先處理你的數據 - 即:以某種方式返回小得多數據爲每個記錄或者不使用ORM爲這個特殊的計算,如果你現在使用一個。確保每條記錄只有您需要的數據,意味着傳輸的數據更少,應用程序需要的內存也會減少。

2

我會把你的大取+過程任務隊列,後臺進程或分叉機制(這裏有很多不同的選項)。

這樣你就可以在主要事件循環之外進行計算,並保持自由處理其他請求。雖然你應該在回調中做你的Mongo查找,但計算本身可能需要時間,因此「凍結」節點 - 你不會暫停處理其他請求。

+0

這個進程**在另一個進程中是** ..不是我的主節點循環(網絡服務器) – Shamoon

+0

啊,好的:我更新了這個問題。 – RyanWilcox

1

既然你不需要它們全部在同一時間(這是我從你的分析推斷),也許最好將這些500k的東西分成更小的塊,在nextTick處理?

你也可以使用類似Kue的東西來排列塊並在稍後處理它們(因此不是在同一時間)。