2016-03-29 3 views
0

私は非同期に書き込まれるレルムデータベースを持っています。ファイルサイズは、Rest APIからの初期ロード中に指数関数的に増加するようです。それは私がそれに書き終わった後、成長し続け、1.5GBでトッピングします。レルムファイルサイズの最小化:実践的アプローチ

writeCopyToPathを使用すると、基礎となるデータは1.5Mbです。以下は

私のINSERTコマンドである:

dispatch_async(dispatch_queue_create("background", nil)) { 
let realm = try! Realm() 
let this_activity = DataManager().getExerciseById(activity_id) 
if this_activity != nil { 
for (_, subJson) in data_ball["mapPoints"] { 
    let map_point = MapPoint(this_activity:this_activity!, json: subJson) 
    try! realm.write { 
     realm.add(map_point) 
    } 
} 
} 

私はそれぞれのViewController(それはデータを返した後に上に保持されていない)によってインスタンス化されたデータマネージャを持って照会するには。データマネージャには次のようなクエリメソッドがあります。

func getSegments(activity_id:String) -> [Dictionary<String, AnyObject>]{ 
    var intervals:[Dictionary<String, AnyObject>] = [] 
    let realm = try! Realm() 
    let predicate = NSPredicate(format: "id == %@", activity_id) 
    let intervals = realm.objects(Segment).filter(predicate).sorted("startTime", ascending: true) 
    for interval in intervals { 
     intervals.append(interval.toDictionary()) 
    } 
    return intervals 
} 

これらのクエリと挿入操作は、同じ期間に発生する可能性があります。このように成長するのを止めるために私はどのような戦略をとるべきですか?

+0

あなたのインサートはどのスレッドで実行されていますか? – bdash

+0

私は 'dispatch_async(dispatch_queue_create(" background "、nil)){'これを削除するだけで新しいスレッドを開始しますか? – John

+0

'dispatch_async'に渡すブロック内のコード全体に自動解放プールを追加できますか? – bdash

答えて

2

古いバージョンのデータへの参照があるため、再利用できない可能性があります。詳細については、レルムのドキュメントのFile size & tracking of intermediate versionsセクションをご覧ください。

+0

あなたはdbのインスタンスを参照していますか?例えば 'let realm = try! Realm() 'やRealmオブジェクト自体のことですか?私はオブジェクトを保持したいが、私はそれらに手紙を書くことを計画していない - 私はどのように進むことができますか? – John

+0

両方。データベースに書き込むコードがどのように構造化されているかについてもう少し詳しく知ることができれば、あなたに対処する可能性のある問題をカバーするために私の答えを広げることができます。私が疑うのは、ネットワーキングの結果としてこれをやっているので、ディスパッチキューで実行されるブロックに書き込みを行っているということです。そうであれば、ソリューションは自動レリースプールでレルムの使用を包むことになりそうです。 – bdash

+0

コード例で編集しました。 – John

関連する問題