通过数千个对象进行RealmResult迭代速度很慢

时间:2019-03-14 18:03:08

标签: java android performance kotlin realm

我有一个项目,我在其中请求获取一些对象。经过一些测试,这是我最快的实现,但是我感觉缺少一些东西。我的数据库中有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...

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

2 个答案:

答案 0 :(得分:2)

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

来自documentation

  

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

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

答案 1 :(得分:1)

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

  • @Index确实有帮助,但对我而言并没有很大帮助
  • 我将专用的可计算对象做得尽可能小
  • 我使用了RealmResults.sum(),它是如此之快,您绝对应该考虑一下
  • 我改变了关系的方向以加快查询速度

当前为0.38s,同时在我的代码中保留一个for循环,否则基本计算需要0.16s,因此我的性能提升在10倍至20倍之间!

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