2016-03-29 2 views
0

У меня есть Realm db, который записывается асинхронно, и размер файла, по-видимому, растет экспоненциально во время начальной загрузки из Rest API. Он продолжает расти после того, как я закончил писать на нем, превысив 1,5 ГБ.Минимизация Realm Размер файла: Практический подход

Использование базовых данных writeCopyToPath составляет 1,5 Мб.

Ниже моя команда вставки:

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 (но не держался после того, как возвращается с данными). У Data Manager есть такие методы запроса:

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 документации Realm.

+0

Вы имеете в виду экземпляр db, например .. 'let realm = try! Realm() 'или сами объекты Realm? Я хочу держаться за объекты, но я не планирую писать им - как я могу продолжить? – John

+0

Оба. Если вы можете поделиться немного больше информации о том, как ваш код структурирован, который записывает в базу данных, я могу расширить свой ответ, чтобы охватить проблемы, которые могут вас затронуть. Мое подозрение состоит в том, что, поскольку вы делаете это в результате работы в сети, вы делаете записи на блоках, выполняемых в очередях отправки. Если это так, то решение, скорее всего, будет заключаться в том, чтобы обернуть ваше использование Realm в пулах автоопределений. – bdash

+0

Отредактировано примером кода. – John

Смежные вопросы