我们看到在插入大量数据(更确切地说,在提交事务时)时,内存使用量出现了大幅增长。当然,我们希望避免这种内存压力。这里是一个快速截图,下面有更详细的说明
另外,我们有以下要求:
因此,我们决定了以下步骤:
在代码方面(简化),此翻译大致与此类似
//We have a small helper, that is use also for other classes
static func getRealm() -> Realm {
do {
let realm = try Realm()
return realm
} catch let error as NSError {
//Log + error
}
}
// The code where the spike occurs
DispatchQueue.global(qos: .background).async {
do {
// opening transaction
RealmHelper.getRealm().beginWrite()
let filesURL = StorageHelper.retrieveFilesURL()
for fileURL in filesURL {
autoreleasepool { // to clear decoded data
//Retrieving data + Decoding objects
let objects = StorageHelper.retrieve(forURL: fileURL)
realm.add(objects.persons, update: true)
realm.add(objects.buildings, update: true)
// and so on (15 differents objects types)
}
}
RealmHelper.getRealm().commitWrite()
} catch let error as NSError {
RealmHelper.getRealm().cancelWrite()
}
}
虽然可行,但您认为这种方法是最好的方法吗?是否有任何减少内存峰值的方法?我们最初认为,通过逐位保存对象并分批保存,可以避免这种行为,但事实并非如此。而且,正如我之前所说的,我们不能分为多个事务(此外,根据文档,对于大量数据,我们不建议这样做)。