Python 获取并迭代大型数据集,什么是确定的?为什么管理日志/应用程序存在差异?
当尝试优化查询以根据位置获取存储记录时,我陷入了一个奇怪的问题(我认为),获取大型数据集需要大量cpu时间 基本上,我有超过1000条记录,需要迭代才能在3000米用户位置内找到商店,我在管理控制台中得到了相当高的数字 这导致了一些数据存储测试,产生了一些获得1000条记录的有趣数字 我有6个测试方法要单独运行,并从管理控制台和appstats中占用cpu时间,结果是(在生产中): 在这里,我最多只获取1000条记录,但需要获取所有记录(大约4-5000条) 我的问题是:Python 获取并迭代大型数据集,什么是确定的?为什么管理日志/应用程序存在差异?,python,google-app-engine,Python,Google App Engine,当尝试优化查询以根据位置获取存储记录时,我陷入了一个奇怪的问题(我认为),获取大型数据集需要大量cpu时间 基本上,我有超过1000条记录,需要迭代才能在3000米用户位置内找到商店,我在管理控制台中得到了相当高的数字 这导致了一些数据存储测试,产生了一些获得1000条记录的有趣数字 我有6个测试方法要单独运行,并从管理控制台和appstats中占用cpu时间,结果是(在生产中): 在这里,我最多只获取1000条记录,但需要获取所有记录(大约4-5000条) 我的问题是: 获取1000条记录真的
为什么获取1000条记录总是导致9179api\u cpu\u ms?为什么检索大量记录会占用大量资源?这是一个O(n)流程,您真的不应该在每个请求的基础上进行此操作。按顺序回答您的问题:
获取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