我想在原生SQLiteDatabase
和Realm
之间进行选择,以处理大量数据。
对于基准测试,我添加了100万个产品实体:
{ID:整数,SKU:字符串,名称:字符串,data_creating:字符串}
使用SQLiteDatabase
,我的设备上花了将近1分34秒。
使用Realm
需要10分钟。
我的代码是:
Realm realm = Realm.getInstance(getApplicationContext());
realm.beginTransaction();
for(int i = 0 ; i < 1000000;i++){
Product product = realm.createObject(Product.class);
product.setId(i+1);
product.setName("Product_"+i);
product.setSku("SKU__"+i);
product.setDateCreated(new Date());
}
realm.commitTransaction();
如何改进代码以获得更好的时间效果?
答案 0 :(得分:10)
最初的问题在Realm中产生了一个讨论,我们最终为insert个对象添加了一个更快的方法。用于创建和插入1个mio对象的代码现在可以写为:
final Product product = new Product();
final Date date = new Date();
try(Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for(int i = 0 ; i < 1000000; i++){
product.setId(i+1);
product.setName("Product_"+i);
product.setSku("SKU__"+i);
product.setDateCreated(date);
realm.insert(product);
}
}
});
}
答案 1 :(得分:9)
你必须意识到SQLite和Realm是两个非常不同的东西。 Realm是一个对象存储,您在上面显示的代码中创建了很多对象。根据您的模型类和行/对象的数量,您经常会看到Realm在插入时有点慢。为了进行公平的比较,你可以将Realm与其中许多优秀的ORM之一进行比较。
说,Realm提供了一个低级接口(io.realm.internal)。我不建议您使用它,因为它目前没有记录。你的例子看起来像这样:
long numberOfObjects = 1000000;
SharedGroup sharedGroup = new SharedGroup("default.realm");
WriteTransaction writeTransaction = sharedGroup.beginWrite();
Table table = writeTransaction.getTable("class_Product");
table.addEmptyRows(numberOfObjects);
for (int i = 0; i < numberOfObjects; i++) {
table.setLong(0, i, i); // id
table.setString(1, i, "Product_"+i); // name
table.setString(2, i, "SKU__"+i); // sku
table.SetDate(3, i, new Date()); // date
}
writeTransaction.commit();
sharedGroup.close();
您现在可以比较两个面向表/行的数据存储,您可能会发现Realm比SQLite快一点。
在Realm,我们对如何让对象界面运行得更快有一些想法,我们希望能够在不久的将来实现它们。