commitWriteTransaction对大型Realm文件的性能

时间:2016-08-01 16:07:53

标签: realm

在OS X上使用Realm 1.0.2,我有一个达到~3.5 Gb的Realm文件。现在,编写一批新对象平均需要大约30秒 - 1分钟,这使得事情变得非常缓慢。 在进行性能分析后,看起来像commitWriteTransaction需要花费大量时间。

在那种情况下,这种表现是正常/预期的吗?如果是这样,有什么策略可以让节省时间更快?

1 个答案:

答案 0 :(得分:0)

只要在写入事务中执行更改,Realm就会使用copy-on-write语义。

必须分叉的结构越大&复制后,执行操作所需的时间越长。

这是我2.8GHz i7 MacBook Pro上的一个不科学的小基准

import Foundation
import RealmSwift

class Model: Object {
  dynamic var prop1 = 0.0
  dynamic var prop2 = 0.0
}

// Add 60 million objects with two Double properties in batches of 10 million
autoreleasepool {
  for _ in 0..<6 {
    let start = NSDate()
    let realm = try! Realm()
    try! realm.write {
      for _ in 0..<10_000_000 {
        realm.add(Model())
      }
    }
    print(realm.objects(Model.self).count)
    print("took \(-start.timeIntervalSinceNow)s")
  }
}

// Add one item to that Realm
autoreleasepool {
  let start = NSDate()
  let realm = try! Realm()
  try! realm.write {
    realm.add(Model())
  }
  print(realm.objects(Model.self).count)
  print("took \(-start.timeIntervalSinceNow)s")
}

记录以下内容:

10000000
took 25.6072470545769s
20000000
took 23.7239990234375s
30000000
took 24.4556020498276s
40000000
took 23.9790390133858s
50000000
took 24.5923230051994s
60000000
took 24.2157150506973s
60000001
took 0.0106720328330994s

因此,您可以看到向Realm添加许多对象,没有关系,速度非常快,并且与添加的对象数成线性比例。

所以你可能不仅仅是在向Realm添加对象,也许你正在更新现有对象,导致它们被复制?

如果您在写入事务中读取所有对象的值,那么它也会与对象数量成比例增长。

避免这些事情会缩短您的写入交易。