大量内存使用穗带域的commitWrite()

时间:2018-11-05 17:40:25

标签: ios swift realm

我们看到在插入大量数据(更确切地说,在提交事务时)时,内存使用量出现了大幅增长。当然,我们希望避免这种内存压力。这里是一个快速截图,下面有更详细的说明

enter image description here

  • 使用的Realm Swift版本:3.11.0
  • iOS:12
  • 要插入的数据量:200 Mo,超过270k对象

另外,我们有以下要求:

  • 我们从远程SQL Server下载数据
  • 我们需要确保所有数据都已正确下载,因为我们不想因为数据库的完整性而出错(丢失数据)

因此,我们决定了以下步骤:

  • 将所有下载的数据存储到临时的单独文件中(在磁盘上)
  • 所有数据下载完毕后,我们进入特定的操作队列
  • 我们开始交易
  • 我们按文件打开文件,保存对象,然后关闭文件
  • 如果在此过程中没有错误,请提交交易
  • 这是我们在提交事务时看到的内存峰值

在代码方面(简化),此翻译大致与此类似

//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()
    }
}

虽然可行,但您认为这种方法是最好的方法吗?是否有任何减少内存峰值的方法?我们最初认为,通过逐位保存对象并分批保存,可以避免这种行为,但事实并非如此。而且,正如我之前所说的,我们不能分为多个事务(此外,根据文档,对于大量数据,我们不建议这样做)。

0 个答案:

没有答案