RealmResult медленно перебирает тысячи объектов - PullRequest
0 голосов
/ 14 марта 2019

У меня есть проект, в котором я делаю запрос на получение некоторых объектов. Это самая быстрая реализация, которая у меня была после нескольких тестов, но я чувствую, что что-то упустил. У меня есть 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 ]

2 голосов
/ 15 марта 2019

попробуйте сделать поле endDate в качестве поля индекса с помощью аннотации.

из документации :

Как и первичные ключи, это делает запись немного медленнее, но делает чтение быстрее.(Это также увеличивает размер файла Realm для хранения индекса.) Лучше добавлять индексы, только когда вы оптимизируете производительность чтения для определенных ситуаций.

import io.realm.annotations.Index;
@Index
private String endDate;
1 голос
/ 20 марта 2019

Я рад, что добился гораздо лучших результатов, используя следующее:

  • @Index действительно помогает, не сильно в моем случае, но все же
  • Я сделалвыделенный вычислимый объект как можно меньшего размера
  • Я использовал RealmResults.sum(), что так быстро, что вы должны это учитывать
  • Я поменял направление отношения, чтобы ускорить запросы

В настоящее время на уровне 0,38 с сохраняется цикл for в моем коде, в противном случае базовые вычисления занимают 0,16 с, поэтому я набираю производительность в 10–20 раз!

Примечание: я больше не использую realm.copyFromRealm(allSessions)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...