如何在GAE Python中读写大量(约1百万)模型实体?
我的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 ()
处的内存限制问题:
超过512 MB的软私有内存限制,之后为623 MB 为1个请求提供服务
有人早点这样做了吗? 最好的方法是什么?
我在TaskQueue Push
队列中执行此操作以避免任何请求超时。
解决了我的问题
感谢大家。我优化了我的算法(之前太乱了)并摆脱了内存问题。你的所有建议都非常有用,但真正的问题是我糟糕的算法。所以我无法在这里接受任何答案。
我在这里留下这个问题(即使我的代码存在问题也没有删除它),以便其他人可以在GAE Python的内存泄漏问题上得到好的指针。
感谢Dmitry Sadovnychyi,Dan Cornilescu和Tim Hoffman。
答案 0 :(得分:1)
您可以将 key_list 拆分成较小的部分并进行迭代。
注意,因为TaskQueue也有时间限制,所以你不要只避免“任何超时”,你可能需要进一步将整个迭代分成更小的块。
我认为这可以很好地利用Pipeline API来解决可伸缩性问题 - 您可能需要查看一下这篇文章:https://blog.svpino.com/2015/05/19/the-google-app-engine-pipeline-api