我不确定是否有其他人有这个问题,但是当我在appengine development server上使用光标链接任务时,我遇到了一个异常“Too big query offset”(不确定是否在live上发生)。在
当在一个查询中处理了4000多条记录后请求游标时,会发生此错误。在
我不知道偏移量和游标有什么关系,也许这只是appengine的sdk中的一个怪癖。在
要修复此问题,请缩短任务延迟之前允许的时间(这样一次处理的记录就更少),或者在检查已用时间时,也可以检查已处理的记录数是否仍在范围内。e、 g,如果时间。时间()>;结束时间或计数==2000。重置计数并延迟任务。2000是一个任意的数字,我不知道极限应该是多少。在
编辑:
在进行上述更改之后,永远不会完成执行。正在调用with_cursor(cursor)代码,但似乎每次都从开头开始。我错过了什么明显的东西吗?在
导致异常的代码如下:
表“Transact”有4800行。错误发生在事务处理.cursor当调用()时时间。时间()>;结束时间为真。4510条记录在游标被请求时已被处理,这似乎导致了错误(在开发服务器上,尚未在其他地方测试)。在
def some_task(trans):
tts = db.get(trans)
for t in tts:
#logging.info('in some_task')
pass
def test_cursor(request):
ret = test_cursor_task()
def test_cursor_task(cursor = None):
startDate = datetime.datetime(2010,7,30)
endDate = datetime.datetime(2010,8,30)
end_time = time.time() + 20.0
transacts = Transact.all().filter('transactionDate >', startDate).filter('transactionDate <=',endDate)
count =0
if cursor:
transacts.with_cursor(cursor)
trans =[]
logging.info('queue_trans')
for tran in transacts:
count+=1
#trans.append(str(tran))
trans.append(str(tran.key()))
if len(trans)==20:
deferred.defer(some_task, trans, _countdown = 500)
trans =[]
if time.time() > end_time:
logging.info(count)
if len(trans)>0:
deferred.defer(some_task, trans, _countdown = 500)
trans =[]
logging.info('time limit exceeded setting next call to queue')
cursor = transacts.cursor()
deferred.defer(test_cursor_task, cursor)
logging.info('returning false')
return False
return True
return HttpResponse('')
希望这对某人有帮助。在
谢谢 伯特
请在不使用iter功能的情况下重试:
这对我有用。在
相关问题 更多 >
编程相关推荐