Каков наиболее эффективный способ хранения длинного списка объектов в царстве?

Я пытаюсь сравнить Realm с Snappydb (Это мое репо для тех, кто хотел бы взглянуть на бенчмарк). Я предполагаю, что мой путь неправильный, так как время от магазина до db занимает очень долгое время в Realm в сравнении с Sanppydb.

Тест показывает следующий результат. Как вы можете видеть на изображении, Realm находится примерно в 100-200 раз медленнее, чем Snappydb. введите описание изображения здесь

Что я делаю, сначала создаю 10 000 объектов, а затем храним их в db. Таким образом, в моем коде я храню объект бронирования таким образом (существует цикл for, который повторяется 10 000 раз):

public void storeBooking(final Booking booking) {
        mRealm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                Booking realmBooking = realm.createObject(Booking.class);
                realmBooking.setId(booking.getId());
                realmBooking.setCode(booking.getCode());
                realmBooking.setFareLowerBound(booking.getFareLowerBound());
                realmBooking.setFareUpperBound(booking.getFareUpperBound());
                realmBooking.setPhoneNumber(booking.getPhoneNumber());
                realmBooking.setPickUpTime(booking.getPickUpTime());
                realmBooking.setRequestedTaxiTypeName(booking.getRequestedTaxiTypeName());
                realmBooking.setTaxiTypeId(booking.getTaxiTypeId());
            }
        });
    }

Любая идея была бы оценена. Спасибо.

Update

Это метод Snappydb для хранения объекта бронирования.

public void storeBooking(final String key, final Booking booking) {
        try {
            mSnappyDb.put(key, booking);
        } catch (SnappydbException e) {
            e.printStackTrace();
        }
    }

Update

Новые результаты с использованием метода insertOrUpdate() и одной транзакции

введите описание изображения здесь

Ответ 1

Ваше исходное решение сохраняет 10000 объектов в 10000 транзакциях и создает для него 10000 объектов, что в значительной степени является наихудшим возможным подходом.


Технически путь right должен быть следующим:

public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.insertOrUpdate(bookings);
        }
    });
}

В большинстве случаев, когда сохраненный объект не совпадает с исходным объектом, я делаю следующее:

public void storeBookings(final List<Booking> bookings) {
    mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmBook realmBook = new RealmBook();
            for(Booking booking : bookings) {
                realmBook = mapper.toRealm(booking, realmBook); // does not create new instance
                realm.insertOrUpdate(realmBook);
            }
        }
    });
}

В этом решении используется 1 отдельный объект для сопоставления содержимого списка.