在OS X上使用Realm 1.0.2,我有一个达到~3.5 Gb的Realm文件。现在,编写一批新对象平均需要大约30秒 - 1分钟,这使得事情变得非常缓慢。 在进行性能分析后,看起来像commitWriteTransaction需要花费大量时间。
在那种情况下,这种表现是正常/预期的吗?如果是这样,有什么策略可以让节省时间更快?
答案 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添加对象,也许你正在更新现有对象,导致它们被复制?
如果您在写入事务中读取所有对象的值,那么它也会与对象数量成比例增长。
避免这些事情会缩短您的写入交易。