2015-05-29 26 views
0

如何在GAE Python中讀取和寫入大量(約1百萬)模型實體?如何在GAE Python中讀取和寫入大量(〜100萬)模型的實體?

我NDB型號:

class X (ndb.Model): 
    Y = ndb.JsonProperty ("a", repeated=True, indexed=False) 
    # max list length = 10. 
    # Example of a list stored in Y above : 
    # Y = [ 
    #  { "n" : "name_p__of_around_100_chars", "s" : number_p__between_0_and_100, "a" : "address_p__of_200_chars" }, 
    #  { "n" : "name_q__of_around_100_chars", "s" : number_q__between_0_and_100, "a" : "address_q__of_200_chars" }, 
    # ] 

我需要閱讀模式"X"的實體,並更新其財產"Y"和寫是回NDB。

我的第一種方法
閱讀使用ndb.get_multi (key_list)所有實體。
這種方法失敗,因爲它擊中的內存限制問題在ndb.get_multi()

服務1個請求總

後的512 MB與623 MB

超出軟專用空間限制有沒有人做到了這一點早?
做什麼是最好的方法?

我在TaskQueue Push隊列中這樣做,以避免任何請求超時。

什麼解決了我的問題
謝謝大家。我優化了我的算法(之前太亂了)並擺脫了內存問題。你所有的建議都非常翔實,但真正的問題是我的壞算法。所以我不能在這裏標記任何答案。

我在這裏留下了這個問題(即使它是我的代碼的問題,也沒有刪除它),以便其他人可以在GAE Python的內存泄漏問題中獲得好的指針。

感謝德米特里薩多夫尼奇,丹Cornilescu和蒂姆霍夫曼。

+1

使用MapReduce的,或在一個請求旋進限批.fetch_page然後用下一個光標創建新的任務。 –

+0

@DmitrySadovnychyi謝謝。我會嘗試它,但GAE在閱讀實體很長一段時間後纔會釋放內存。我使用'fetch_page'讀取了一組實體(比如說100),併爲該組100個實體激發了「TaskQueue」任務。當我讀取下一組100個實體時,較早的一組100個實體的內存(RAM)仍然保留。新內存將變爲100 + 100 = 200. – gsinha

+1

您可以嘗試調用gc.collect –

回答

1

你可以將你的key_list分成小塊並遍歷它們。

小心,因爲TaskQueue也有時間配額,所以你不會避免只是「任何超時」,你可能需要進一步拆分整個迭代成更小的塊。

我想這樣可以使良好的管線使用的API來解決可擴展性 - 你可能想看看這篇文章:https://blog.svpino.com/2015/05/19/the-google-app-engine-pipeline-api

相關問題