【问题标题】:What is the most efficient way to store long list of Objects in Realm?在领域中存储一长串对象的最有效方法是什么?
【发布时间】:2016-09-08 03:14:01
【问题描述】:

我正在尝试将 RealmSnappydb 进行比较(This is my repo 对于那些想要查看基准的人)。我想我的方法是错误的,因为与 Sanppydb 相比,Realm 中的 store-to-db 时间需要很长时间。

基准测试显示以下结果。如图所示,Realm 比 Snappydb 慢 100-200 倍左右。

我正在做的是首先创建 10,000 个对象,然后将它们存储到数据库中。因此,在我的代码中,我以这种方式存储了一个 Booking 对象(有一个迭代 10,000 次的 for 循环):

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());
            }
        });
    }

更新

这是用于存储 Booking 对象的 Snappydb 方法。

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

更新

使用insertOrUpdate() 方法和一笔交易的新结果

【问题讨论】:

  • 您能分享您与之比较的 SnappyDB 代码吗?
  • @bdash 我刚刚更新了我的问题。请看一看。谢谢。
  • 据我所知,通过您对 Realm 的实现,您必须创建一个领域实例,这需要时间和内存(这里我们必须创建 10.000 次)。所以在我看来,你应该先尝试运行一个循环来创建 10.000 个预订,然后将它们存储在一个只有一个领域实例的事务中。
  • 显示for循环。回答这个问题很重要。
  • 但从技术上讲,您在 10000 个事务中保存了 10000 个对象,并为它创建了 10000 个对象,所以这几乎是最糟糕的方法,哈哈

标签: android realm snappydb


【解决方案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 个分离的对象来映射列表的内容。

【讨论】:

  • 酷,我不知道insertOrUpdate() 方法。我试图按照他们在示例代码中显示的方式进行操作。我知道有问题,但你帮我找到了更好的方法。谢谢。
  • 别忘了指定新的基准测试结果,我很好奇:P
  • 我更新了我的问题。我的仓库有一个链接;)
  • 大约 1.5-2.0 秒,听起来不错 :) 但是很高兴看到使用多个事务与仅使用一个事务之间存在如此显着的差异。表明人们应该小心他们正在做的事情。
  • @EpicPandaForce 这里什么是映射器?我无法识别它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多