Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何优化此代码?我想解决死线超标的问题_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

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