lorenzo
lorenzo

Reputation: 1743

RealmResult iteration through thousands of objects is slow

I have a project where I make a request to get some objects. This is the fastest implementation I have after making some tests but I feel I'm missing something. I have 2000 objects in database for my tests and the code before the computation takes 3.25 seconds to execute.

    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...

I have to access values for all objects to performs sum, averages and so on. What would be the fastest way to do that?

Upvotes: 1

Views: 701

Answers (2)

lorenzo
lorenzo

Reputation: 1743

I'm glad to have achieved much better results using the following:

  • @Index does help, not by a lot in my case but still
  • I made a dedicated computable object as small as possible
  • I used RealmResults.sum() which is so fast you should absolutely consider it
  • I reversed the direction of a relationship to speed up queries

Currently at 0.38s while keeping a for loop in my code, otherwise basic calculations takes 0.16s, so I'm in between a 10x to 20x performance gain!

Note: I no longer use realm.copyFromRealm(allSessions)

Upvotes: 1

Aks4125
Aks4125

Reputation: 5720

try making endDate field as Index field using annotation.

from documentation:

Like primary keys, this makes writes slightly slower , but makes reads faster. (It also makes your Realm file slightly larger, to store the index.) It’s best to only add indexes when you’re optimizing the read performance for specific situations.

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

Upvotes: 2

Related Questions