【问题标题】:RealmResult iteration through thousands of objects is slowRealmResult 通过数千个对象进行迭代很慢
【发布时间】:2019-03-14 18:03:08
【问题描述】:

我有一个项目,我请求获取一些对象。这是我进行一些测试后最快的实现,但我觉得我错过了一些东西。我在数据库中有 2000 个对象用于测试,计算前的代码需要 3.25 秒才能执行。

    val allSessions = realm.where(Session::class.java).isNotNull("endDate").findAll()

    // added for better performances
    val sessionsList = realm.copyFromRealm(allSessions)

    val sessionGroup1 = mutableListOf<Session>()
    val sessionGroup2 = mutableListOf<Session>()

    // otherwise the bottleneck is here, the foreach is slow
    sessionsList.forEach { session ->
        if (session.isGroup1()) {
            sessionGroup1.add(session)
        } else {
            sessionGroup2.add(session)
        }
    }

    // doComputations(), like sums, averages...

我必须访问所有对象的值以执行求和、平均等。 最快的方法是什么?

【问题讨论】:

  • 你为什么要从 Realm 复制它们? :o
  • 这是我目前最胖的实现。否则,我在 RealmResult 对象上有一些非常慢的 foreach
  • 那意味着你使用了很多项目,我猜没有更多的事情要做
  • 我对性能不太熟悉,但感觉很慢
  • @Aks4125 这完全取决于你想要做什么。

标签: java android performance kotlin realm


【解决方案1】:

尝试使用注释将endDate 字段作为索引字段。

来自documentation

与主键一样,这会使写入速度稍慢,但会使读取速度更快。 (这也会使您的 Realm 文件稍大一些,以存储索引。)最好仅在针对特定情况优化读取性能时添加索引。

import io.realm.annotations.Index;
@Index
private String endDate;

【讨论】:

  • 谢谢。我做到了,但性能提升大约 10%,这还不错,但我觉得还有更多工作要做!
  • 性能到底在哪里下降?你能发布代码你在用sessionsList做什么吗?
  • 您可以通过从 Realm 获取基于查询的结果来最小化循环。获取基于会话的结果列表。如果您要使用这种方法,请尝试将组字段也设为索引。
  • 我不确定这在代码方面意味着什么,或者这与我开始编写的代码有何不同?我的对象的来源是 Realm.where...findAll()
  • 类似于RealmResults&lt;Session&gt; sessionGroup1 = realm.where(...).equalTo("group1", true).findAll()
【解决方案2】:

我很高兴使用以下方法取得了更好的结果:

  • @Index 确实有帮助,对我来说不是很多,但仍然
  • 我使一个专用的可计算对象尽可能小
  • 我使用了RealmResults.sum(),速度如此之快,您绝对应该考虑一下
  • 我颠倒了关系的方向以加快查询速度

目前在 0.38 秒,同时在我的代码中保留一个 for 循环,否则基本计算需要 0.16 秒,所以我的性能提升介于 10 倍到 20 倍之间!

注意:我不再使用realm.copyFromRealm(allSessions)

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多