2016-03-29 46 views
0

我有一個Realm db,它是異步寫入的,並且在來自Rest API的初始加載期間文件大小似乎呈指數級增長。寫完之後它會繼續增長,最終達到1.5GB。使用writeCopyToPath,底層數據爲1.5 Mb。最小化領域文件大小:實用方法

下面是我的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) 
    } 
} 
} 

要查詢我有一個由每個視圖控制器實例化(而不是緊緊抓住它的數據返回後)數據管理。數據管理器具有這樣的查詢方法:

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'的塊中添加一個autorelease池嗎? – bdash

回答

2

這很可能是您持有對舊版數據的引用,從而阻止它被回收。請參閱Realm文檔的File size & tracking of intermediate versions部分以獲取更多信息。

+0

你指的是db的一個實例,例如:'let realm = try! Realm()'或Realm對象本身?我想堅持這些東西,但我不打算寫信給他們,我該怎麼辦? – John

+0

兩者。如果您可以分享有關您的代碼的結構如何寫入數據庫的更多信息,我可以擴展我的答案以涵蓋可能解決您的問題。我的懷疑是,因爲你是通過網絡來做這件事的,所以你正在寫入在調度隊列上執行的塊。如果是這種情況,那麼解決方案很可能是將自己的Realm用在autorelease池中。 – bdash

+0

使用代碼示例進行編輯。 – John