2015-05-11 28 views
0

我正在使用Google Apps API將所有數據(用戶,組,單位部門)從API存儲到數據存儲中,然後查詢數據存儲以顯示用戶以進行搜索觀看。GAE設備中的內存不足

我正在使用任務加載用戶和組。我遵循的方法是從API讀取數據,然後在循環中創建每個用戶的實體,然後查找nextPageToken,如果不是null,則分配另一個加載用戶的任務。團隊和OU也遵循同樣的方法。

現在的問題是,如果我在有2k用戶的谷歌域上運行它,它工作正常,但是當我在擁有90K用戶的環境上運行它時,它可以正常工作,直到達到12-13k用戶,然後停止響應並且任務停止響應,並且我的機器上的內存使用率更高,我的本地devserver上就是這種情況,因爲我還沒有在appengine上部署它。

上面介紹的方法有很多後端代碼,但我不確定在這裏提供什麼,所以請提出可能會導致問題的問題。我會在這裏粘貼代碼片段,無論是什麼要求!

實際的生產服務器將有兩倍的用戶數量,即接近200K,這對我來說很重要。請幫忙!

+0

你有沒有試過在他們的服務器上運行這個?它可能會在測試服務器上遇到一些瓶頸。 –

+0

@ gaurav-sachdeva如果您使用任務隊列來完成這項工作,那麼當您降低吞吐量時會發生什麼情況?如果你嘗試將'max-concurrent-requests'值設置爲1? –

+0

不幸的是,設置最大併發請求不是一個選項,因爲它需要永遠完成200k用戶。 –

回答

0

不要嘗試在一個循環中創建所有用戶/實體,然後將所有內容保存在一個步驟中,這是不必要的,並且(當您遇到它時)需要更多的內存。

取而代之的是將其分成更小的組,例如,例如,將您的週期限制爲100個實體,保存這100個並繼續。這樣處理請求的實例不需要在內存中保存數千個實體。

你提到你正在做這個任務。你的瓶頸是記憶。通過減少任務創建和保存的實體數量,您將有效地增加執行該任務的請求數量,並且由於任務處理的實體數量會減少,您不僅會增加請求數量,還會增加請求率。這將導致任務的內存使用量減少,這將建議GAE平臺更頻繁地啓動新的實例,這意味着您將擁有更多的內存。

因此,在任務中處理較少的實體是減少內存需求的一種很好且簡單的方法。

+0

我正在運行使用任務的用戶/組的加載,每個任務只處理500個用戶,而不是更多。我相信,500不應該增加內存負載。它可能是別的嗎? –

+0

@GauravSachdeva我會降低500的限制(例如100),因爲保存500個實體可能會導致達到一些數據存儲超時。但理論上它應該與500一起工作。也許你沒有清除你存儲它們的列表? – icza

+0

每次在每個新任務中,都會根據服務器的響應創建一個新的對象列表,所以我應該在哪裏清除它? –