2016-08-01 8 views
0

OS XでRealm 1.0.2を使用すると、〜3.5Gbに達するRealmファイルがあります。現在、新しいオブジェクトのバッチを作成するには、平均で約30秒〜1分かかるため、処理がかなり遅くなります。 プロファイリング後、commitWriteTransactionが大きな時間を費やしているように見えます。大きなRealmファイルのcommitWriteTransactionのパフォーマンス

その場合、その性能は通常どおりですか?もしそうなら、その節約時間を短縮するためにはどんな戦略が利用可能でしょうか?

+0

こんにちは。レルムに3.5Gb相当のデータを格納していますか、実際に格納しているデータ量よりもかなり大きなレルムファイルですか? – AustinZ

+0

あなたはバックグラウンドスレッドのrealmインスタンスの周りに 'autoreleasepool'を使っていません。そして、明らかにあなたは、[example](http://stackoverflow.com/a/34087874/2413303)を参照してください。 – EpicPandaForce

+0

確かに、そこには3.5Gbのデータがあります。それほど多くないオブジェクトを除いて、それはそれぞれ約2倍の6000万のオブジェクトに相当します(今私はそれについて考えています。おそらく浮動小数点数で逃げることができます)。 自動解放プールに関しては、書き込みのバッチは実際にはNSURLConnectionのコールバックから毎回呼び出されるメソッドで行われるため、自動解放プールには各コミット間に時間があります。 – Kettch

答えて

0

レルムは、変更が書き込みトランザクションで実行されるたびに、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 

ですから、無関係で、レルムに多くのオブジェクトを追加することがあることがわかります非常に高速で、追加されるオブジェクトの数に比例して線形にとどまります。

レルムにオブジェクトを追加するだけではなく、既存のオブジェクトを更新してコピーされる可能性があります。

書き込みトランザクションの一部としてすべてのオブジェクトから値を読み取っている場合、その値もオブジェクトの数に比例して増加します。

これを回避すると、書き込みトランザクションが短くなります。

+0

私はそこでどんなクエリも実行しておらず、既存のオブジェクト。しかし、私が挿入しようとしているオブジェクトには、ちょっとだけの倍精度以上のものが含まれています。インデックス付きのNSDateと別の種類のオブジェクトとの関係もあります(もう1つは読み取り専用のRLMLinkingObjectsです)。それらが成長している時期を引き起こしているのでしょうか? – Kettch

+0

インデックスされたプロパティだけでも、物事は線形に保たれます。関係は、あなたのケースでは、高価な部分をフォークする可能性が高いです。私はあなたをさらに助けるためにいくつかのコードを見る必要があると思う。 – jpsim

関連する問題