Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 - Fatal编程技术网

Python 获取并迭代大型数据集,什么是确定的?为什么管理日志/应用程序存在差异?

Python 获取并迭代大型数据集,什么是确定的?为什么管理日志/应用程序存在差异?,python,google-app-engine,Python,Google App Engine,当尝试优化查询以根据位置获取存储记录时,我陷入了一个奇怪的问题(我认为),获取大型数据集需要大量cpu时间 基本上,我有超过1000条记录,需要迭代才能在3000米用户位置内找到商店,我在管理控制台中得到了相当高的数字 这导致了一些数据存储测试,产生了一些获得1000条记录的有趣数字 我有6个测试方法要单独运行,并从管理控制台和appstats中占用cpu时间,结果是(在生产中): 在这里,我最多只获取1000条记录,但需要获取所有记录(大约4-5000条) 我的问题是: 获取1000条记录真的

当尝试优化查询以根据位置获取存储记录时,我陷入了一个奇怪的问题(我认为),获取大型数据集需要大量cpu时间

基本上,我有超过1000条记录,需要迭代才能在3000米用户位置内找到商店,我在管理控制台中得到了相当高的数字

这导致了一些数据存储测试,产生了一些获得1000条记录的有趣数字

我有6个测试方法要单独运行,并从管理控制台和appstats中占用cpu时间,结果是(在生产中):

在这里,我最多只获取1000条记录,但需要获取所有记录(大约4-5000条)

我的问题是:

  • 获取1000条记录真的需要20秒(10054cpu_ms+9179api_cpu_ms)吗
  • 为什么AppSTA和管理控制台时间之间存在差异?我的配额是多少
  • 通过将获取的记录作为protobuf推送到memcache,可以很容易地解决这个问题。但我对AppSTA和管理控制台之间的高使用率和时间差异很好奇

    奖金问题
    为什么获取1000条记录总是导致9179api\u cpu\u ms?

    为什么检索大量记录会占用大量资源?这是一个O(n)流程,您真的不应该在每个请求的基础上进行此操作。按顺序回答您的问题:

  • 它使用多少CPU时间取决于记录的性质,但这一结果并不令人惊讶。请注意,这是近20 CPU秒,而不是挂钟秒。还请注意,当新的计费模式推出时,您将对数据存储操作和实例小时数收取费用,这是您应该优化的
  • 管理控制台显示您根据的权威数字计费。appstats的数字更低,因为它们只计算API调用期间花费的时间,而不是执行自己的代码所花费的时间
  • 如果您的记录集很小并且相当静态,那么您应该将它们缓存在实例内存中,而不是每次提取它们或将它们存储在memcache中。如果它们更大、更动态,那么您应该使用类似geomedel的工具,这样您就可以进行地理查询并只获取相关记录


    获取1000条记录总是需要相同数量的API CPU时间,因为这是数据存储访问成本的表示方式——实际上并不需要时间。新机型通过将其拆分为单独的计费业务解决了这一问题。

    感谢您的澄清。我明白,要想得到很多的要求需要时间。我会查一查这本书的。第一个请求在放入缓存之前需要很长时间(管理控制台中为红色),这有什么不利之处吗?谷歌后端处理这些实例在扩展方面有什么不同吗?@fredrik缺点是你让用户等待;如果您的加载请求很慢,那么它不会影响扩展。不过,您应该研究预热处理程序,它可以让您在第一个面向用户的请求之前加载这些数据,至少在某些时候是这样。
        r = db.GqlQuery("SELECT __key__ FROM StoreRecords").fetch(1000)
        # appstats: real=120ms cpu=182ms api=845ms
        # admin console: 459ms 1040cpu_ms 845api_cpu_ms
    
        r = db.GqlQuery("SELECT __key__ FROM StoreRecords").fetch(100)
        # appstats: real=21ms cpu=45ms api=95ms
        # admin console: 322ms 134cpu_ms 95api_cpu_ms
    
        r = db.GqlQuery("SELECT * FROM StoreRecords").fetch(1000)
        # appstats: real=1208ms cpu=1979ms api=9179ms
        # admin console: 1233ms 10054cpu_ms 9179api_cpu_ms
    
        r = db.GqlQuery("SELECT * FROM StoreRecords").fetch(100)
        # appstats: real=57ms cpu=82ms api=929ms
        # admin console: 81ms 1006cpu_ms 929api_cpu_ms
    
        r = model.StoreRecords.all().fetch(1000)
        # appstats: real=869ms cpu=1526ms api=9179ms
        # admin console: 1061ms 9956cpu_ms 9179api_cpu_ms
    
        r = model.StoreRecords.all().fetch(100)
        # appstats: real=74ms cpu=86ms api=929ms
        # admin console: 97ms 1025cpu_ms 929api_cpu_ms