对在Python应用程序引擎上使用数据存储进行分页感到困惑吗
我正在构建一个Webapp2应用程序,并试图找到分页的最佳解决方案。 我发现流行的方法是使用光标。例如:对在Python应用程序引擎上使用数据存储进行分页感到困惑吗,python,google-app-engine,pagination,google-cloud-datastore,Python,Google App Engine,Pagination,Google Cloud Datastore,我正在构建一个Webapp2应用程序,并试图找到分页的最佳解决方案。 我发现流行的方法是使用光标。例如: # My solution is to get all cursors in the very first time # For example, there will be 2 cursors for 3 pages # page1|c1|page2|c2|page3 page_size = 20 all = model.MyModel.gql(...) ... if cursor:
# My solution is to get all cursors in the very first time
# For example, there will be 2 cursors for 3 pages
# page1|c1|page2|c2|page3
page_size = 20
all = model.MyModel.gql(...)
...
if cursor:
# Use cursor to get items
list = all.with_curosr(...)
else:
# Get all cursors and memcaching all cursors
...
我也尝试了另一个解决方案,虽然我知道很多人会认为这是个坏的解决方案:
# In this solution, I try to split query into many list
# page1(list1)|page2(list2)|page3(list3)
page_size = 20
all = list(model.MyModel.gql(...))
lists = [all[i:i+page_size] for i in range(0, len(all), page_size)]
# Client will send the page number to server side
list = []
if len(lists) > 0:
list = lists[int(page_number)-1]
我的问题来了!
使用游标的优点是什么
两个解决方案都需要执行MyModel.gql(…)来获取数据,而第一个解决方案仍然需要使用鼠标(…)来执行来检索项目。
这让我很困惑
如果您有更好的解决方案或任何改进我的解决方案的建议,请与我分享!非常感谢你 使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn) 使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n) 因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们 因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间
请参阅有关这方面的官方文档:使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn) 使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n) 因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们 因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间
请参阅有关这方面的官方文档:使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn) 使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n) 因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们 因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间
请参阅有关这方面的官方文档:使用光标与使用页面有很大的区别。使用游标时,获取下一个游标结果非常有效:最多O(1)或O(logn) 使用分页时,需要将整个数据存储查询结果扫描到您请求的页面:每个页面请求O(n) 因此,像使用游标迭代所有页面这样的简单操作最多是O(n logn),而使用页面则是O(n^2)。这不仅需要更多的时间,还需要更多的数据存储读取,因为在谷歌内部,它仍然会读取到请求页面的所有条目,然后过滤掉它们 因此,它还将在数据存储读取方面产生更多的成本,并且如果您有许多请求,并且更有可能启动另一个实例,那么它还将产生更多的实例时间
请参阅有关这方面的官方文档:感谢您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。多亏了您的精心设计。现在我意识到使用游标可以比使用偏移量减少读取操作。