レルムは、変更が書き込みトランザクションで実行されるたびに、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
ですから、無関係で、レルムに多くのオブジェクトを追加することがあることがわかります非常に高速で、追加されるオブジェクトの数に比例して線形にとどまります。
レルムにオブジェクトを追加するだけではなく、既存のオブジェクトを更新してコピーされる可能性があります。
書き込みトランザクションの一部としてすべてのオブジェクトから値を読み取っている場合、その値もオブジェクトの数に比例して増加します。
これを回避すると、書き込みトランザクションが短くなります。
こんにちは。レルムに3.5Gb相当のデータを格納していますか、実際に格納しているデータ量よりもかなり大きなレルムファイルですか? – AustinZ
あなたはバックグラウンドスレッドのrealmインスタンスの周りに 'autoreleasepool'を使っていません。そして、明らかにあなたは、[example](http://stackoverflow.com/a/34087874/2413303)を参照してください。 – EpicPandaForce
確かに、そこには3.5Gbのデータがあります。それほど多くないオブジェクトを除いて、それはそれぞれ約2倍の6000万のオブジェクトに相当します(今私はそれについて考えています。おそらく浮動小数点数で逃げることができます)。 自動解放プールに関しては、書き込みのバッチは実際にはNSURLConnectionのコールバックから毎回呼び出されるメソッドで行われるため、自動解放プールには各コミット間に時間があります。 – Kettch