gpt4 book ai didi

java - Google App-Engine Datastore 速度极慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:37 24 4
gpt4 key购买 nike

我需要帮助来理解为什么下面的代码需要 3 到 4 秒。

更新:我的应用程序的用例是获取某人自上次登录以来的 Activity 提要。该提要可以包含来自 friend 的更新或他可能感兴趣的他网络之外的一些新项目。 Activity 表存储所有此类 Activity ,当用户登录时,我在 GAE-DataStore 上运行查询以返回上述 Activity 。我的应用程序也支持无限滚动,因此我需要 GAE 的光标功能。在给定时间,我得到大约 32 个项目,但 Activity 表可能有数百万行(因为它包含来自所有用户的数据)。

目前 Activity 表很小,只包含 25 条记录,下面的 java 代码只从同一个表中读取 3 条记录。

Activity 表中的每条记录都有 4 个 UUID 字段。

我无法想象如果表包含数百万行并且结果包含数百行,查询会如何表现。

我下面的代码有问题吗?

(我正在使用 Objectify 和应用引擎游标)

Filter filter = new FilterPredicate("creatorID", FilterOperator.EQUAL, userId);
Query<Activity> query = ofy().load().type(Activity.class).filter(filter);
query = query.startAt(Cursor.fromWebSafeString(previousCursorString));
QueryResultIterator<Activity> itr = query.iterator();
while (itr.hasNext())
{
Activity a = itr.next();
System.out.println (a);
}

我已经经历了Google App Engine Application Extremely slow并验证如果我继续刷新我的页面(调用上面的代码)响应时间会有所改善。然而,改进只有 ~30%

将此与任何其他数据库进行比较,如此小的数据的响应时间以毫秒为单位,甚至不到 100 毫秒。

我对 GAE DataStore 的常规数据库性能的期望是错误的吗?

我现在还不想打开 memcache,因为我想在不先缓存的情况下改进这一层。

最佳答案

不确定您的查询应该做什么,但它看起来并不需要游标查询。在我看来,游标查询的唯一有效用例是对结果行数有限的数据进行分页查询。由于您的查询没有限制,我根本不明白您为什么要使用游标。

当您需要数百万个结果时,您可能正在对数据进行临时分析(因为没有人能够解释数百万个原始数据行),您最好使用 BigQuery 而不是应用引擎数据存储区。我只是在这里猜测,但对于普通的前端应用程序,您很少需要结果中的数百万行,而只需要从可用行总数中筛选出几行(有时可能数百行)。

另一件事:

您确定是查询耗时较长吗?它也可能是查询的包装器。由于您使用的是游标,因此您必须重新调用查询,直到没有更多结果为止。处理此问题的成本可能很高。

最后:

您是在 appengine 本身还是在本地开发服务器上进行测试? devserver 显然不能模拟云,因此有时可能比真实的东西慢(或快)。当您的查询生成新实例时,devserver 不知道实例预热时间。

说到云:关于云数据库的事情不在于它们对极少的数据具有最佳性能,而是它们在处理数百和数十亿行时始终如一地扩展和执行。

编辑:

After performing a retrieval operation, the application can obtain a cursor, which is an opaque base64-encoded string marking the index position of the last result retrieved.

[...]

The cursor's position is defined as the location in the result list after the last result returned. A cursor is not a relative position in the list (it's not an offset); it's a marker to which the Datastore can jump when starting an index scan for results. If the results for a query change between uses of a cursor, the query notices only changes that occur in results after the cursor. If a new result appears before the cursor's position for the query, it will not be returned when the results after the cursor are fetched. (Datastore Queries)

这两个语句使人们相信查询性能应该与游标查询或不使用游标查询保持一致。

这里还有一些你可能想要检查的东西:

  • 如何使用 objectify 注册您的实体类?
  • 您的实际测试代码是什么样的?我想看看您如何以及在何处进行测量。
  • 能否分享一下游标查询和无游标查询之间的比较?
  • 多个请求的改进可能是 Objectifys 集成缓存的结果。您可能希望为数据存储性能测试禁用缓存

关于java - Google App-Engine Datastore 速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30022910/

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