2014-10-08 18 views
16

Tôi có một đối tượng lĩnh vực với ~ 30 trường, sau khi thêm và loại bỏ một số đối tượng có vẻ như lĩnh vực này chiếm khá nhiều không gian. Kích thước của không gian được phân bổ dường như phát triển phần nào theo cấp số nhân:Cách thích hợp để xóa bảng/cơ sở dữ liệu của Realm?

10 * (thêm 100 + loại bỏ tất cả) = 4 mb dữ liệu

15 * (thêm 100 + loại bỏ tất cả) = 33 mb dữ liệu

20 * (thêm 100 + loại bỏ tất cả) = 91 mb dữ liệu

25 * (thêm 100 + loại bỏ tất cả) = 179 mb dữ liệu

image

Các tập tin đó tự trong data \ data \ app_folder \ files \ default.realm là 200 mb vào thời điểm này.

Bây giờ vấn đề nghiêm trọng này có thể là do tôi không làm điều gì đó đúng cách. Trước mỗi chèn i làm

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

mục Thêm vào lĩnh vực trông như thế này:

for (Submission submission : submissionList){ 
     realm.beginTransaction(); 

     RealmSubmission realmSubmission = realm.createObject(RealmSubmission.class); 
     RealmObjectUtils.copySubmission(realmSubmission, submission); 

     realm.commitTransaction(); 
    } 

Bất kỳ ý tưởng?

+0

Phiên bản nào của Vương quốc này là xảy ra trên? – Emanuelez

+0

70.1 .. bạn cũng có thể muốn kiểm tra liên kết trên trang chính vì nó tải xuống một tệp mở rộng có tên "mới nhất" (tôi thấy bạn đã phát hành 71.0 nhưng khác với các phần tải xuống chính của trang tải xuống từ đâu để tải xuống) – chrystolin

+0

Oh tôi thấy cài đặt 71.0 đơn giản hơn nhiều – chrystolin

Trả lời

8

Tôi đã thử sao chép với một lớp mô hình nhỏ (một String, một int) không thành công.

Bạn có sử dụng Liên kết và/hoặc LinkLists trong mô hình của mình không? Tôi có thể có một cái nhìn vào nó?

Một lý do có thể là trong trường hợp bạn có ví dụ một lớp Người có trường RealmListdogs. Khi bạn xóa tất cả các phần tử của kiểu Person, các chú chó bây giờ được giữ lại trong cơ sở dữ liệu.

EDIT: Sau khi bạn cung cấp dữ liệu tôi đã cố gắng với một chút dữ liệu giả:

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

Nhưng tôi vẫn không thể tái sản xuất:

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 

Kích thước gấp đôi là bình thường vì phân mảnh, nhưng Tôi vẫn không thấy gì có thể gợi ý trải nghiệm của bạn.

Thời gian cao do số lượng giao dịch lớn. Việc kết hợp chúng lại với nhau sẽ làm tăng hiệu suất đáng kể:

10-08 14:45:25.009 31593-31593/myapp.realm.io.sizeleak I/REALMTEST﹕ Time: 408 
+0

Đó là một đại diện của một trình reddit: http://pastebin.com/b8mPTKam và copysubmission xử lý trường hợp nếu bất kỳ trường nào là null, bởi vì tôi đã từng có ngoại lệ tương tự, rằng tôi không thể chèn null http://pastebin.com/ur6f7jXW – chrystolin

+0

có thể đã bị nhầm lẫn về việc chèn null sau đó. :) – chrystolin

+0

Kết hợp các giao dịch với nhau đã giúp, 1,5 mb sau 20 * 100, 2,9 sau 40 * 100, 3,7 mb sau 60 * 100, 4,1mb sau giao dịch 80 * 100. Lưu trữ 4,1mb sau 100 * 100. Tôi không biết tại sao thực hiện rất nhiều giao dịch nhỏ kết thúc với một sự rò rỉ lớn trái ngược với một giao dịch lớn, nhưng nó hoạt động bây giờ, và tôi hài lòng với nó, thực hành tốt hơn của nó để làm điều này. – chrystolin

0

ok những thứ cũ nhưng dù sao đi nữa.tôi bắt đầu sử dụng Realm trong android bây giờ và tôi vẫn đang kiểm tra nó ra nhưng đối với những trải nghiệm quá khứ sử dụng cơ sở dữ liệu OO vì các giao dịch có thể bị hủy bỏ nhiều giao dịch bạn làm lớn hơn dấu chân bạn sẽ để lại, để hủy bỏ một bản sao nhà nước phải tồn tại nhưng bạn đang cam kết đúng, từ kinh nghiệm của tôi là một số cơ sở dữ liệu không loại bỏ các giao dịch ngay sau khi cam kết nhưng điều này đằng sau công cụ cảnh (tôi không thể xác nhận điều này, chỉ nói về những kinh nghiệm trước đây mà tôi đã có các cơ sở dữ liệu OO khác nơi bạn có thể cấu hình các cài đặt này)

một điều khác mà tôi nhận thấy ở cả hai mã ở đây là không có trường hợp nào là và do đó (cũng suy đoán) có thể là Realm của mỗi giao dịch cam kết không thể nhận được GC

một lần nữa chỉ cần suy đoán hy vọng điều này sẽ giúp

3

Bạn nên xóa tệp Realm. Cho đến lần đầu tiên bạn sử dụng Realm không có tập tin được tạo ra. Đó là những gì bạn muốn:

try { 
    Realm.deleteRealmFile(context); 
    //Realm file has been deleted. 
} catch (Exception ex){ 
    ex.printStackTrace(); 
    //No Realm file to remove. 
} 

Đảm bảo không có trường hợp realm nào được sử dụng.

+6

Câu trả lời này là lỗi thời. – localhost

+0

Vì vậy, localhost, câu trả lời của bạn là gì? –

+3

Realm.getDefaultInstance(). DeleteAll(); – Frank

18

Tôi đã thực hiện một phương pháp đơn giản để xóa tệp cơ sở dữ liệu mặt hàng khi ngoại lệ di chuyển xảy ra (đối với dev). Nó cũng trả về một thể hiện lĩnh vực mới để ngăn chặn bất kỳ vấn đề nào.

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. 
     } 
    } 
} 
4

Xóa tất cả các đối tượng từ cơ sở dữ liệu Realm:

realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     realm.deleteAll(); 
    } 
}); 
Các vấn đề liên quan