Python 如何优化此代码?我想解决死线超标的问题
我想从数据存储中提取数据。我对编程比较陌生,所以在页面上打印结果对我来说似乎很容易。不幸的是,大多数时候(并非总是!)我都会出现以下错误。你能帮我一下吗 错误消息:Python 如何优化此代码?我想解决死线超标的问题,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我想从数据存储中提取数据。我对编程比较陌生,所以在页面上打印结果对我来说似乎很容易。不幸的是,大多数时候(并非总是!)我都会出现以下错误。你能帮我一下吗 错误消息: 500 Server Error The server encountered an error and could not complete your request. 日志: 死线超差 我的理解是我的查询太慢了: 我如何加速它 class ExpData(db.Model): # According to
500 Server Error The server encountered an error and could not complete your request.
日志:
死线超差
我的理解是我的查询太慢了:
我如何加速它
class ExpData(db.Model):
# According to Datastore Admin, there are 20,557 entities in this model.
created = db.DateTimeProperty(auto_now_add = True)
username = db.StringProperty(required=True)
task1n = db.StringProperty(required=False, indexed=False)
task1a = db.StringProperty(required=False, indexed=False)
task1c = db.StringProperty(required=False, indexed=False)
task2n = db.StringProperty(required=False, indexed=False)
task2a = db.StringProperty(required=False, indexed=False)
task2c = db.StringProperty(required=False, indexed=False)
task3n = db.StringProperty(required=False, indexed=False)
task3a = db.StringProperty(required=False, indexed=False)
task3c = db.StringProperty(required=False, indexed=False)
task4n = db.StringProperty(required=False, indexed=False)
task4a = db.StringProperty(required=False, indexed=False)
task4c = db.StringProperty(required=False, indexed=False)
q1 = db.StringProperty(required=False)
q2 = db.StringProperty(required=False)
ecus = db.StringProperty(required=False)
class Viewer(Handler):
def get(self):
test = ExpData.all().order('-created')
expDataDict = {}
expDataList = []
for entity in test:
if (entity.q2 == "-1") or (entity.q2 == ""):
continue
else:
expDataList.append(entity.created)
expDataList.append(entity.username)
expDataList.append(entity.ecus)
expDataList.append(entity.q1)
expDataList.append(entity.q2)
expDataList.append(entity.task1c)
expDataList.append(entity.task2c)
expDataList.append(entity.task3c)
expDataList.append(entity.task4c)
expDataDict[entity.created] = {}
expDataDict[entity.created]["username"] = entity.username
expDataDict[entity.created]["ecus"] = entity.ecus
expDataDict[entity.created]["q1"] = entity.q1
expDataDict[entity.created]["q2"] = entity.q2
expDataDict[entity.created]["task1c"] = entity.task1c
expDataDict[entity.created]["task2c"] = entity.task2c
expDataDict[entity.created]["task3c"] = entity.task3c
expDataDict[entity.created]["task4c"] = entity.task4c
self.render("viewer.html", otherDict = expDataDict)
非常感谢您的帮助。首先,尝试将这些条件添加到查询中,而不是在检索结果
(entity.q2==“-1”)或(entity.q2==”)
后运行它们。其次,为了查看那个么多的数据,您应该查看结果的分页。你应该调查一下
利用延期付款。
并从您的延迟任务中创建摘录,并将其作为电子邮件发送给您
对于延迟的任务,请求限制为10分钟。如果您在10分钟内完成提取,您就可以了
伪代码:
为后台任务创建模块extract_task.py
''' extract_task.py '''
from StringIO import StringIO
from google.appengine.api import mail
def extract():
output = StringIO()
test = ExpData.all().order('-created')
for entity in test:
# Just extracting 3 fileds per row for the example.
output.write('%s,%s,%s\n' % (entity.created, entity.username, entity.ecus))
mail.send_mail(sender="youremail@example.com",
to="Albert Johnson <youremail@example.com>",
subject="Extract",
body="""
Extract attached.
""",
attachments=[('extract.csv', output)])
app.yaml
将以下条目添加到app.yaml的内置部分:
- deferred: on
以及同一文件的handlers部分的以下条目:
- url: /_ah/queue/deferred
script: google.appengine.ext.deferred.deferred.application
login: admin
是的,这行不通。您应该查看访问模式,并了解如何缓存或将输出预计算为缓存。尝试通过查询显示所有实体会随着添加的数量增加而变得更糟。试着按照下面的答案使用光标。@TimHoffman-谢谢。这是我的实验数据,我想提取出来进行数据分析。我不打算收集更多的数据。你能推荐其他下载方式吗?可能是CSV?如果您只是想获取数据以供以后分析。考虑使用远程API shell并使用游标将其拖动并保存本地。这样,您就不必部署新代码,而且可能需要很长时间(只要您使用批处理,比如一次使用1000项),因为这不是前端请求。这看起来非常有趣,谢谢!请你简要概述一下我将如何通过电子邮件向自己发送结果?编辑我的答案以添加更多细节。看一看***没有经过测试的代码非常惊人。非常感谢你的帮助@通过电子邮件发送给自己只是你的选择之一。您甚至可以将摘录写入blobstore并从那里获取。
- deferred: on
- url: /_ah/queue/deferred
script: google.appengine.ext.deferred.deferred.application
login: admin