重复添加到 RealmList 的效率
Efficiency of repeatedly adding to a RealmList
在其中一个 Realm 代码示例中,它们具有以下内容,
for (int j = 0; j < i; j++) {
Cat cat = realm.createObject(Cat.class);
cat.setName("Cat_" + j);
person.getCats().add(cat);
}
如果 i
恰好非常大,如超过 1k 或更高,会发生什么情况?这意味着 person.getCats()
正在抓取一个长列表只是为了添加一个值。这有效率吗?如果没有,更好的方法是什么?
你说得对。这不是最好的方法,您将在每一行获得列表:
- 使用事务有你有批量的工作要做。都会是
立即执行(一起)
- 循环添加,
每个 COMMITSIZE
提交事务
long added=0;
long COMMITSIZE =100;
//open transaction
realm.beginTransaction();
pCats = person.getCats();
for (int j = 0; j < i; j++) {
Cat cat = realm.createObject(Cat.class);
cat.setName("Cat_" + j);
pCats.add(cat);
if(added%COMMITSIZE == 0){
realm.commitTransaction();
//reopen transaction
realm.beginTransaction();
}
}
//commit transaction
realm.commitTransaction();
getCats()
只会获取对列表的引用,因此即使是很长的列表也不成问题。
Realm 的原则之一是零复制,因此一旦得到 Realm 的支持,它们就不会被复制 - 参见 http://www.slideshare.net/ChristianMelchior/realm-building-a-mobile-database。
在其中一个 Realm 代码示例中,它们具有以下内容,
for (int j = 0; j < i; j++) {
Cat cat = realm.createObject(Cat.class);
cat.setName("Cat_" + j);
person.getCats().add(cat);
}
如果 i
恰好非常大,如超过 1k 或更高,会发生什么情况?这意味着 person.getCats()
正在抓取一个长列表只是为了添加一个值。这有效率吗?如果没有,更好的方法是什么?
你说得对。这不是最好的方法,您将在每一行获得列表:
- 使用事务有你有批量的工作要做。都会是 立即执行(一起)
- 循环添加,
每个 COMMITSIZE
提交事务long added=0; long COMMITSIZE =100; //open transaction realm.beginTransaction(); pCats = person.getCats(); for (int j = 0; j < i; j++) { Cat cat = realm.createObject(Cat.class); cat.setName("Cat_" + j); pCats.add(cat); if(added%COMMITSIZE == 0){ realm.commitTransaction(); //reopen transaction realm.beginTransaction(); } } //commit transaction realm.commitTransaction();
getCats()
只会获取对列表的引用,因此即使是很长的列表也不成问题。
Realm 的原则之一是零复制,因此一旦得到 Realm 的支持,它们就不会被复制 - 参见 http://www.slideshare.net/ChristianMelchior/realm-building-a-mobile-database。