gpt4 book ai didi

java - 如何在实际遍历所有结果之前获取 App Engine 查询中的结果数

转载 作者:行者123 更新时间:2023-11-29 07:08:22 24 4
gpt4 key购买 nike

在我的 Google App Engine 应用程序中,我需要从数据存储区查询中获取并返回大量实体,以响应服务调用 GET 请求。此调用可能返回数千个实体和 MB 的序列化数据。

响应数据包的第一部分传达序列化结果中有多少实体,然后是所有序列化实体。目前我正在使用 QueryResultIterator 遍历查询中的所有实体达到最大页面大小限制,之后我返回一个游标,该游标可用于从上一个调用停止的地方继续获取(如果达到最大值并且查询中仍有结果)。当我遍历结果时,我将它们保存在一个列表中。一旦我用尽了查询结果或达到了最大页面大小,我就可以从此列表的大小中获取实体的数量。但随后我必须再次遍历此列表以序列化每个实体并将结果写入响应输出流。

我不知道这是执行此操作的最有效方法。有没有一种方法可以在实际遍历所有实体或将它们直接提取到列表中之前获取查询结果中的实体数量? (列表方法无论如何都不起作用,因为我正在使用游标,这需要使用 QueryResultIterator)。

QueryResultIterator 有一个方法 getIndexList() .这是获取查询结果中实体数量的一种成本较低的方法吗?我假设此列表将只包含查询结果中每个实体的一个索引对象。另外,我需要这个列表只包含在插入器的当前光标位置之后的实体的索引。我的理解是否正确,或者这种方法不会达到我认为的效果?

与加载整个实体列表相比,仅包含索引的列表需要的内存要少得多。虽然,我不知道这个列表是否会受到查询的预取或 block 大小的限制,或者我是否想使用查询的限制参数,因为我只想知道有多少实体在最大页面大小加一的结果(知道还有更多结果并提供光标以继续)。

目前我正在设置预取和 block 大小(到我的页面限制的大小),但我没有使用限制或偏移参数,因为我使用的是游标。据我了解,游标优于偏移/限制。设置限制参数会影响继续使用游标进行查询吗?

很明显,关于 GAE 数据存储查询如何工作以及它们如何受更改参数的影响,我有很多问题。因此,任何见解都值得赞赏。 App Engine API 的文档通常很少,就像对方法的一句话描述几乎说明了可以从方法签名中推断出的内容。否则他们通常不会详细介绍。也许我现在这样做的方式毕竟还不错。它按原样工作,但我正在尝试优化服务调用,以便为我的客户端应用程序获得最佳响应时间。

更新:顺便说一下,我正在使用 Objectify v3 在我的应用程序中执行此查询。我需要在多个地方使用低级数据存储 API,包括执行地理位置查询(使用 geomodel )和投影查询(Objectify v3 不支持)。因此,如果有使用 Objectify 执行此操作的好方法,那将是理想的。否则我可以使用低级 API,但这样总是比较困惑。

最佳答案

低级 api 和 Objectify 都有一个 count() 方法(有关详细信息,请参阅 javadoc)。然而,计数可能是一个非常昂贵和冗长的操作——它为每个返回的数字花费 1 个小操作。例如,返回 5000 的 count() 需要 5000 次小操作(加上查询的 1 次读取),并且所花的时间与对所有 5000 次进行仅键扫描所需的时间一样长(这正是 GAE 实际所做的)。

如果你绝对必须有一个精确的计数,你可能需要通过递增/递减(可能是分片的)计数器来自己聚合这个值。当您处理过滤查询时,这会变得非常棘手。

这里没有唯一正确的解决方案。谷歌搜索给你总计,如“大约 119,000,000 个结果”,这些结果是故意不准确的,几乎可以肯定是预先计算的。对于较小的结果集,使用 count() 是可以接受的 - 但您可能想要应用 limit() 以便您永远不会破产。你总是可以说“超过 500 个结果...”

关于java - 如何在实际遍历所有结果之前获取 App Engine 查询中的结果数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17018425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com