2015-04-15 71 views
2

使用週期中,其中超過3000次迭代:約1000Android的境界:內存

for (Element e2 : elinks2) { 
    AllAuthors allauthor = new AllAuthors(); 
    allauthor.setUrl_base(href.substring(0, href.length() - 1)); 
    allauthor.setAuthor_fio(e2.text().trim()); 
    allauthor.setLetters(e.attr("href")); 

    Realm realm_2 = null; 
    try { 
      realm_2 = Realm.getInstance(new File(func.getFolder("db")), getResources().getString(R.string.app_name_db) + ".realm"); 
      realm_2.beginTransaction(); 
      realm_2.copyToRealmOrUpdate(allauthor); 
      realm_2.commitTransaction(); 
    } finally { 
      if(realm_2 != null) { 
       realm_2.close(); 
      } 
    } 
} 

在添加(或更新)記錄一個錯誤就行

Out of memory in io_realm_internal_SharedGroup.cpp line 164 

發誓

realm_2.commitTransaction(); 

有什麼建議嗎?

AllAuthors.class:

@RealmClass 
public class AllAuthors extends RealmObject { 

    @PrimaryKey 
    private String url_base; 

    private String author_fio; 

    private String letters; 

    ....Standard getters & setters generated.... 
} 

回答

2

您正在不斷開放,並同時在同一時間有很多小的交易關閉境界。雖然這種模式非常低效,但它本身不應該導致內存不足。但是,如果您在後臺線程中運行此操作,則對於每個事務,Realm將不得不維護原始數據的差異,直到所有線程上的Realms都可以更新爲止(發生在Looper事件上或調用Realm.refresh() )。我建議重構到下面,這是更快,更少的內存密集型:

Realm realm_2 = Realm.getInstance(new File(func.getFolder("db")), getResources().getString(R.string.app_name_db) + ".realm"); 
realm_2.beginTransaction(); 
for (Element e2 : elinks2) { 
    AllAuthors allauthor = new AllAuthors(); 
    allauthor.setUrl_base(href.substring(0, href.length() - 1)); 
    allauthor.setAuthor_fio(e2.text().trim()); 
    allauthor.setLetters(e.attr("href")); 
    realm_2.copyToRealmOrUpdate(allauthor); 
} 
realm_2.commitTransaction(); 
realm_2.close(); 
+0

奇怪的是,它的工作原理。謝謝! – SmallSani