2015-04-15 5 views
2

Использование цикла, в котором более 3000 итераций:Android Realm: Из памяти

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

После добавления (или обновление) около 1000 записей об ошибке,

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 в то же время иметь много мелких сделок. Хотя этот шаблон очень неэффективен, он сам по себе не должен вызывать нехватку памяти. Однако, если вы используете это в фоновом потоке, для каждой транзакции 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

Смежные вопросы