Каков наиболее эффективный способ хранения длинного списка объектов в царстве?
Я пытаюсь сравнить 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 отдельный объект для сопоставления содержимого списка.