如何在GAE Python中读写大量(~1百万)模型实体?

时间:2015-05-29 13:48:52

标签: python google-app-engine google-cloud-datastore

如何在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。

1 个答案:

答案 0 :(得分:1)

您可以将 key_list 拆分成较小的部分并进行迭代。

注意,因为TaskQueue也有时间限制,所以你不要只避免“任何超时”,你可能需要进一步将整个迭代分成更小的块。

我认为这可以很好地利用Pipeline API来解决可伸缩性问题 - 您可能需要查看一下这篇文章:https://blog.svpino.com/2015/05/19/the-google-app-engine-pipeline-api