如何在 Realm 中正确添加 100 万个项目?
How to add 1 milion items in Realm correctly?
我想在原生 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();
如何改进我的代码以获得更好的时间性能?
你必须意识到 SQLite 和 Realm 是两个截然不同的东西。 Realm 是一个对象存储,您在上面显示的代码中创建了很多对象。根据您的模型 class 和 rows/objects 的数量,您经常会发现 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();
您现在可以比较两个面向 table/row 的数据存储,您可能会发现 Realm 比 SQLite 快一点。
在 Realm,我们有一些关于如何让我们的对象接口更快 运行 的想法,我们希望能够在不久的将来实现它们。
最初的问题在 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);
}
}
});
}
我想在原生 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();
如何改进我的代码以获得更好的时间性能?
你必须意识到 SQLite 和 Realm 是两个截然不同的东西。 Realm 是一个对象存储,您在上面显示的代码中创建了很多对象。根据您的模型 class 和 rows/objects 的数量,您经常会发现 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();
您现在可以比较两个面向 table/row 的数据存储,您可能会发现 Realm 比 SQLite 快一点。
在 Realm,我们有一些关于如何让我们的对象接口更快 运行 的想法,我们希望能够在不久的将来实现它们。
最初的问题在 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);
}
}
});
}