2009-12-25 78 views
1

嗨,我已经搜索了App Engine组,但找不到明确的解决方案。Google App Engine Put()超时

我想将1000个实体放到我的App Engine服务器(生产服务器)中,但是我得到超时错误和500个服务器错误。它在当地发展中完美运作。

为了减少Put负载,我在每10次投入后让代码休眠5秒钟。我仍然得到了同样的错误:(

请点我在正确的方向非常感谢您的见解

代码:。

class User(db.Model) 
    nickname = db.StringProperty() 
    feed = db.StringListProperty() 

class Initialize(webapp.RequestHandler): 
    def get(self): 
    self.response.headers['Content-Type'] = 'text/plain' 
    start = 0 
    end = 10 

    #add 1000 users (10 Puts x 100 rows) 
    for row in range(1,100): 
    for i in range(start,end): 
     nickname = "nickname" + str(i) 
     feed = ["string1","string2","string3","string4","string5"] 

     User(key_name=str(i),nickname=nickname,feed=feed).put() 

     self.response.out.write('Entry %s done\n' % i) 

    #add counters by 10 
    start = start + 10 
    end = end + 10 

    #sleep 
    time.sleep(5) 

    self.response.out.write('Initialized 1000 users for Datastore.') 

回答

2

我建议您需要将批量写入批处理,因为写入操作需要大量时间,否则您将超出每个请求的AppEngine的最大CPU使用率。分解成批的正确方法是有多个单独的请求,每个请求都添加少量记录。

因此,编写Initialize处理程序,以便可以多次调用它,每次调用完成整个工作的一小部分。

1

我做了5秒钟的代码睡眠后,每10 puts

这是行不通的,因为你的请求在它超时之前只需要一定的时间。那个限制。

您需要将您的操作拆分为多个请求,例如使用任务队列。

+0

来自App Engine的任务队列API目前是实验性的。有没有其他方法已经被使用?谢谢。 – fooyee 2009-12-25 14:03:48

+0

我现在正在考虑一个cron工作。使用它是一个好主意吗? – fooyee 2009-12-25 14:07:34

1

还有一件要考虑的事情是GAE有时会在应用程序休眠一段时间后的第一个请求中出错/超时。似乎需要一段时间才能“唤醒”应用程序,如果应用程序在几个小时内处于非活动状态,那么在这样的时间之后的第一个请求几乎会自动出现。

在初始故障后,您是否尝试过重新执行您的请求?

+0

我将脚本重新编码为一个简单的for循环与100个投入。 我在网页浏览器中手动输入了10次back2back。有效。 我会尝试查看任务队列API。 – fooyee 2009-12-25 14:41:47

1

数据存储区超时更可能出现在大容量存储器中,因此最简单的解决方案是以较小的批次存储记录。如果您的执行时间耗尽(请求超时),则需要使用任务队列将操作分解为许多小请求。