如何在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和蒂姆霍夫曼。
使用MapReduce的,或在一個請求旋進限批.fetch_page然後用下一個光標創建新的任務。 –
@DmitrySadovnychyi謝謝。我會嘗試它,但GAE在閱讀實體很長一段時間後纔會釋放內存。我使用'fetch_page'讀取了一組實體(比如說100),併爲該組100個實體激發了「TaskQueue」任務。當我讀取下一組100個實體時,較早的一組100個實體的內存(RAM)仍然保留。新內存將變爲100 + 100 = 200. – gsinha
您可以嘗試調用gc.collect –