12

RealmSnappydbを比較しようとしています(これは、ベンチマークを見たい人のための私のレポです)。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()メソッドと 1 つのトランザクションを使用した新しい結果

ここに画像の説明を入力

4

1 に答える 1

11

元のソリューションでは、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 つの切り離されたオブジェクトを使用して、リストのコンテンツをマップします。

于 2016-09-08T08:23:10.987 に答える