〜30個のフィールドを持つレルムオブジェクトがあります。いくつかのオブジェクトを追加および削除した後、レルムがかなりのスペースを占有しているようです。割り当てられたスペースのサイズは、指数関数的に増加するようです。
10 *(100を追加+すべて削除)= 4 mbデータ
15 *(100を追加+すべて削除)= 33 mbデータ
20 *(100を追加+すべて削除)= 91 mbデータ
25 *(100を追加+すべて削除)= 179 mbデータ
Data\data\app_folder\files\default.realm内のファイル自体は、この時点で200 mbです。
今、この深刻な問題は、私が適切に何かをしていないためかもしれません。すべての挿入の前に
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
realm.where(RealmSubmission.class).findAll().clear();
// if i use realm.allObjects(RealmSubmission.class).clear(); the leak is even bigger, i get to 170mb Data with 20*(add 100 + remove all) even though both calls do the same by looking at their semantics.
realm.commitTransaction();
レルムへのアイテムの追加は次のようになります。
for (Submission submission : submissionList){
realm.beginTransaction();
RealmSubmission realmSubmission = realm.createObject(RealmSubmission.class);
RealmObjectUtils.copySubmission(realmSubmission, submission);
realm.commitTransaction();
}
何か案は?
小さなモデルクラス(1つのString、1つのint)で複製を試みましたが、成功しませんでした。
モデルでリンクやリンクリストを使用していますか?ご覧になれますか?
1つの理由は、たとえばRealmListdogsフィールドを持つPersonクラスがある場合です。 Personタイプのすべての要素を削除すると、犬は現在データベースに保持されています。
編集:あなたがデータを提供した後、私は少しのダミーデータで試しました:
Realm.deleteRealmFile(this);
Realm realm = Realm.getInstance(this);
File realmFile = new File(this.getFilesDir(), "default.realm");
long tic = System.currentTimeMillis();
for (int i = 0; i < 25; i++) {
for (int j = 0; j < 100; j++) {
realm.beginTransaction();
TestObject testObject = realm.createObject(TestObject.class);
testObject.setApprovedBy("Approver_" + j);
testObject.setAuthor("Author_" + j);
testObject.setBannedBy("Banner_" + j);
testObject.setClicked(j % 2 == 0);
testObject.setCommentCount(j);
testObject.setCreated(System.currentTimeMillis());
testObject.setCreatedUTC(j*7);
testObject.setEdited(j % 3 == 0);
realm.commitTransaction();
}
realm.beginTransaction();
realm.where(TestObject.class).findAll().clear();
realm.commitTransaction();
Log.i(TAG, "Size: " + realmFile.length());
}
long toc = System.currentTimeMillis();
Log.i(TAG, "Time: " + (toc - tic));
しかし、私はまだ再現できません:
10-08 14:39:01.579 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576
10-08 14:39:01.999 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576
10-08 14:39:02.409 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576
10-08 14:39:02.809 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576
10-08 14:39:03.209 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 24576
10-08 14:39:03.649 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:04.049 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:04.449 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:04.839 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:05.329 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:05.709 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:06.259 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:06.689 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:07.109 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:07.589 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:08.019 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:09.129 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:09.729 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:10.169 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:10.669 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:11.049 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:11.449 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:11.849 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:12.269 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Size: 49152
10-08 14:39:12.269 29233-29233/myapp.realm.io.sizeleak I/REALMTEST﹕ Time: 11265
断片化のためにサイズが倍になると予想されますが、あなたの経験を示唆するものはまだありません。
トランザクション数が多いため、タイミングが高くなります。それらをまとめてバッチ処理すると、パフォーマンスが大幅に向上します。
10-08 14:45:25.009 31593-31593/myapp.realm.io.sizeleak I/REALMTEST﹕ Time: 408
移行例外が発生する(開発者向け)の場合、レルムデータベースファイルを削除する簡単な方法を作成しました。また、問題を防ぐために新しいレルムインスタンスを返します。
public Realm buildDatabase(){
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
try {
return Realm.getInstance(realmConfiguration);
} catch (RealmMigrationNeededException e){
try {
Realm.deleteRealm(realmConfiguration);
//Realm file has been deleted.
return Realm.getInstance(realmConfiguration);
} catch (Exception ex){
throw ex;
//No Realm file to remove.
}
}
}
Realmデータベースからすべてのオブジェクトを削除:
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.deleteAll();
}
});
Realmファイルを削除する必要があります。 Realmを初めて使用するまで、ファイルは作成されません。それはあなたが望むものです:
try {
Realm.deleteRealmFile(context);
//Realm file has been deleted.
} catch (Exception ex){
ex.printStackTrace();
//No Realm file to remove.
}
レルムインスタンスが使用されていないことを確認してください。
古いものは大丈夫ですが、とにかく。私はAndroidでRealmを使い始めましたが、まだチェックアウトしていますが、過去の経験ではOOデータベースを使用してトランザクションをキャンセルできるため、状態のコピーをキャンセルするために残すフットプリントを大きくしますが、正しいコミットです、私の経験から、いくつかのデータベースはコミットした直後にトランザクションを破棄しないが、これは舞台裏ですもの(これを確認することはできません。他のOOこれらの設定を構成できるデータベース)で経験したことについて話しているだけです)
ここの両方のコードで私が気づいたもう1つのことは、インスタンスを閉じないため、コミットされた各トランザクションのレルムがGCを取得できない可能性があることです
再びそれが役立つことを期待しているだけです