我從Node.js的MongoDB集合中返回一批(500k +)文檔。它不是用於在網站上顯示,而是用於數據處理。如果我抓住所有這些文件,系統就會凍結。有沒有更好的方法來抓住這一切?通過Node.js從MongoDB返回大量項目
我在想分頁可能工作嗎?
編輯:這已經是主要的node.js服務器事件循環外,所以「系統凍結」並沒有意味着「傳入的請求沒有被處理」
我從Node.js的MongoDB集合中返回一批(500k +)文檔。它不是用於在網站上顯示,而是用於數據處理。如果我抓住所有這些文件,系統就會凍結。有沒有更好的方法來抓住這一切?通過Node.js從MongoDB返回大量項目
我在想分頁可能工作嗎?
編輯:這已經是主要的node.js服務器事件循環外,所以「系統凍結」並沒有意味着「傳入的請求沒有被處理」
學習更多關於您的情況後,我有一些想法:
做盡可能多,你可以在一個Map/Reduce function in Mongo - 也許,如果你扔在節點較少的數據,可能是解決方案。
也許這麼多的數據正在吃掉你係統中的所有內存。你的「凍結」可能是V8停止系統做垃圾回收(see this SO question)。你可以使用V8標誌--trace-gc來記錄GCs &證明這個假設。 (感謝another SO answer about V8 and Garbage collection
分頁,就像你的建議可能會有所幫助,甚至可能甚至將你的數據分割成工作隊列(創建一個引用記錄1-10的工作任務,另一個引用記錄11-20,等)取決於你的計算
也許預先處理你的數據 - 即:以某種方式返回小得多數據爲每個記錄或者不使用ORM爲這個特殊的計算,如果你現在使用一個。確保每條記錄只有您需要的數據,意味着傳輸的數據更少,應用程序需要的內存也會減少。
我會把你的大取+過程任務隊列,後臺進程或分叉機制(這裏有很多不同的選項)。
這樣你就可以在主要事件循環之外進行計算,並保持自由處理其他請求。雖然你應該在回調中做你的Mongo查找,但計算本身可能需要時間,因此「凍結」節點 - 你不會暫停處理其他請求。
這個進程**在另一個進程中是** ..不是我的主節點循環(網絡服務器) – Shamoon
啊,好的:我更新了這個問題。 – RyanWilcox
你爲什麼需要它? Nodejs不適用於數據處理。你會考慮使用MongoDB map/reduce功能嗎? –
不幸的是我們被鎖在'Node.js'中 – Shamoon
除非你告訴你正在嘗試做什麼以及你現在正在做什麼,否則這是無法回答的。 – Tomalak