2016-04-22 12 views
0

RealmObjectまたはRealmListまたはRealmResultをプリロードする方法はありますか?データベースからemを読み込んでメモリに格納するのが好きです。私が知る限り、Realmは実際のデータをクラスオブジェクトのフィールドに格納しません。しかし、私は少なくともメモリに格納する必要があります。REALM:RealmObjectsをプリロードする

私は大きなRealmObjectに複数のRealmObjectがリンクされているとします。ある時点で、私はこれらの子供たちを繰り返し、その分野のいくつかを読まなければなりません。単にRAMからの値を読み取るよりも、少し遅れることになります。ある時点で、UIスレッドでこれらの値を繰り返し処理する必要があるかもしれません。

私はRealmResults.load()について読んだことがありますが、その背後にある力学を本当に理解できませんでした。それは実際にデータをプリロードしますか?

ありがとうございました。

+1

レルムは、基礎となるストレージエンジンでmmapを使用して、データベースファイルをメモリにマップしています。つまり、同じデータに2回アクセスすると、カーネルがスワイプしないと、そのデータは既にメモリにロードされています。問題は、javaヒープからデータをロードする必要があるため、毎回ネイティブヒープからJavaヒープにデータをロードする必要があります。あなたが実際にアクセスする必要があるスーパーホットデータが本当に必要な場合は、スタンドアロンオブジェクトを作成し、データがJavaヒープにある 'RealmObject.copyFromRealm()'を使うことが考えられます。しかしオブジェクトはもはやレルムによって管理されません。 – beeender

+0

素晴らしい!それだけが必要。レルムが管理している私の 'RealmObject'は本当に気にしません。なぜなら、データを一度GUIにバインドするだけでメモリにコピーしなければならないからです。 この問題の詳細を知りたいです。 'RealmChangeListener'を' RealmObject'にバインドすると、それを 'Realm'から切り離すとどうなりますか? 'Realm.copyFromRealm'が別のオブジェクトを返すので、コールバックは変更時に呼び出されると思います。右? また、 'RealmResults.load()'が実際に何をするのか理解したいと思いますが、それは私が推測する別の質問です。 – atomontage

+1

'RealmObject.copyFromRealm()'は新しいオブジェクトを返し、古いオブジェクトは同じままです。しかし、スタンドアロンオブジェクトはRealmによってもう管理されないので、そのデータは自動更新されません。 'RealmResults.load()'はこれとは何の関係もなく、非同期クエリに関連しています。 **クエリがまだ終了していない場合は、現在のスレッドをブロックして非同期クエリを実行/ロードしようとします**。 – beeender

答えて

0

beeender により、上述したように:

レルム メモリにDBファイルをマッピングするために、基礎となるストレージエンジンにMMAPを使用しています。これは、同じデータを2回アクセスすると、カーネルがスワイプしないと、すでに がメモリにロードされていることを意味します。 。問題は、javaヒープからデータをロードする必要があるため、毎回 データをネイティブヒープからJavaヒープにロードする必要があります。 の提案は、いつもスーパーホットデータが にアクセスする必要がある場合、おそらく RealmObject.copyFromRealm()を使用してスタンドアロンオブジェクトを作成し、 データがJavaヒープにあると考えることができます。しかし、オブジェクトはもはやレルムによって管理されません。

関連する問題