Каков наиболее эффективный способ хранения длинного списка объектов в области?
Я пытаюсь сравнить Realm со Snappydb ( это мой репозиторий для тех, кто хотел бы взглянуть на бенчмарк). Я предполагаю, что мой путь неверен, так как время хранения в БД занимает очень много времени в Realm по сравнению с Sanppydb.
Бенчмарк показывает следующий результат. Как вы можете видеть на изображении, Realm примерно в 100-200 раз медленнее, чем Snappydb.
Я сначала создаю 10 000 объектов, а затем сохраняю их в БД. Итак, в моем коде я храню объект Booking таким образом (есть цикл 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());
}
});
}
Любая идея будет оценена. Благодарю.
Обновить
Это метод Snappydb для хранения объекта бронирования.
public void storeBooking(final String key, final Booking booking) {
try {
mSnappyDb.put(key, booking);
} catch (SnappydbException e) {
e.printStackTrace();
}
}
Обновить
Новые результаты с использованием insertOrUpdate()
метод и одна транзакция
1 ответ
Ваше оригинальное решение сохраняет 10000 объектов в 10000 транзакций и создает для него 10000 объектов, так что это практически худший из возможных подходов.
Технически правильный путь должен быть таким:
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 отдельный объект для сопоставления содержимого списка.