Swift 最小化领域文件大小:实用方法

Swift 最小化领域文件大小:实用方法,swift,realm,Swift,Realm,我有一个异步写入的领域数据库,在RESTAPI的初始加载期间,文件大小似乎呈指数增长。在我写完之后,它继续增长,达到1.5GB 使用writeCopyToPath,基础数据为1.5 Mb 下面是我的insert命令: dispatch_async(dispatch_queue_create("background", nil)) { let realm = try! Realm() let this_activity = DataManager().getExerciseById(activit

我有一个异步写入的领域数据库,在RESTAPI的初始加载期间,文件大小似乎呈指数增长。在我写完之后,它继续增长,达到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)
    }
 }   
}
为了查询,我有一个数据管理器,它由每个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
}
func getSegments(活动\u id:String)->[字典]{
变量间隔:[字典]=[]
让realm=try!realm()
let谓词=NSPredicate(格式:“id=%@”,活动\u id)
让间隔=realm.objects(Segment).filter(谓词).sorted(“startTime”,升序:true)
对于间隔中的间隔{
interval.append(interval.toDictionary())
}
返回间隔
}

这些查询和插入操作可以在同一时间段内发生。我应该用什么策略来阻止它像这样增长

很可能您持有对旧版本数据的引用,从而阻止数据被回收。查看Realm文档部分以了解更多信息。

您可能持有对旧版本数据的引用,从而阻止数据被回收。查看Realm文档的一节了解更多信息。

您是指db的实例吗,例如..
let Realm=try!Realm()
还是Realm对象本身?我想抓住这些东西,但我不打算给它们写信——我怎么才能继续呢?两者兼而有之。如果你能分享更多关于你的代码是如何写入数据库的信息,我可以扩展我的答案来涵盖可能会解决你的问题。我的怀疑是,由于您这样做是因为建立了网络,所以您正在对调度队列上执行的块执行写操作。如果是这种情况,那么解决方案很可能是将您对领域的使用包装在自动释放池中。您是指db的实例,例如..
let Realm=try!Realm()
还是Realm对象本身?我想抓住这些东西,但我不打算给它们写信——我怎么才能继续呢?两者兼而有之。如果你能分享更多关于你的代码是如何写入数据库的信息,我可以扩展我的答案来涵盖可能会解决你的问题。我的怀疑是,由于您这样做是因为建立了网络,所以您正在对调度队列上执行的块执行写操作。如果是这种情况,那么解决方案很可能是将您对领域的使用包装在自动释放池中。您在哪些线程上执行插入?我使用'dispatch\u async(dispatch\u queue\u create(“background”,nil))启动一个新线程{`我应该删除这个吗?你能试着在你传递到
dispatch\u async
的块中的整个代码周围添加一个自动释放池吗?可以!谢谢你的帮助-领域支持很棒!(你的数据库也很好!)你的插入是在哪些线程上执行的?我使用'dispatch\u async'启动一个新线程(dispatch_queue_create(“background”,nil)){`我应该删除这个吗?你能试着在传递给
dispatch_async
的块中的整个代码周围添加一个自动释放池吗?可以!谢谢你的帮助-领域支持非常棒!(你的数据库也非常好!)