领域缓慢插入数据(主键UUID()。uuidString)

时间:2017-05-06 21:57:46

标签: ios swift database xcode realm

我在我的一个项目中使用Realm数据库。一切都很顺利,直到在其中一个表中我必须将主键设置为UUID()。uuidString,如领域文档中所建议的那样。该应用程序具有同步机制,从服务器获取数据,解析JSON并插入Realm数据库。

在此表中,主键设置为UUID()。uuidString,当数据增长到100k以上时,数据插入变得非常慢。起初我无法弄清楚错误是什么,这是我的代码的问题还是这是领域数据库的问题。因此,我创建了一个新的测试项目,并在主键设置为UUID()。uuidString时发现了Realm的奇怪行为。

我执行了2次测试,首先将主键设置为UUID()。uuidString,然后将主键设置为整数。除了所提到的主键值的差异之外,模型,代码,数据插入的数量(每个事务中的40k行数据)对于两个测试是相同的。我发现结果如下,这是令人惊讶的。

领域对象

class TestData: Object {

dynamic var id = UUID().uuidString // "For 1st test"
dynamic var id = 0 // "For 2nd test"
dynamic var graphNum = 0
dynamic var yAxis = 0
dynamic var xAxis = ""
dynamic var legend = ""
dynamic var year = ""

override static func primaryKey() -> String? {
    return "id"
}

}

我的代码

        try! realm.write {
                for i in 0..<40000 { // 40000..<80000, 80000..<120000 ...... till 240000 for 2nd test
                    let data = TestData()
                    data.id = i //For 2nd test
                    data.legend = "02/01/17"
                    data.graphNum = 1346
                    data.xAxis = "Month"
                    data.yAxis = 9
                    data.year = "2017"
                    realm.add(data, update:true)
                }
        }

测试1:UUID()。uuidString作为主键

按下按钮执行6次交易。

输出

每次交易插入40k行数据所花费的时间。

第一击 - &gt; 1.72675597667694秒,db中的总记录 - &gt; 40k(快速插入)

第二击 - &gt; 1.76628297567368秒,db中的总记录 - &gt; 80k(快速插入)

第三击 - &gt; 3.18893700838089秒,db中的总记录 - &gt; 120k(变慢)

第4次点击 - &gt; 6.45702600479126秒,db中的总记录 - &gt; 160k(变慢)

第五击 - &gt; 9.80401802062988秒,db中的总记录 - &gt; 200k(变慢)

第6次点击 - &gt; 12.9913129806519秒,db中的总记录 - &gt; 240k(越来越慢)

继续插入相同数量的数据,即40k,插入时间随着数据在表中的增长而增加。

测试2:Int作为主键

执行相同数量的交易

输出

每次交易插入40k行数据所花费的时间。

第一击 - &gt; 2.36865001916885秒,db中的总记录 - &gt; 40k(快速插入)

第二击 - &gt; 1.69827800989151秒,db中的总记录 - &gt; 80k(快速插入)

第三击 - &gt; 1.62342000007629秒,db中的总记录 - &gt; 120k(快速插入)

第4次点击 - &gt; 1.70833700895309秒,db中的总记录 - &gt; 160k(快速插入)

第五击 - &gt; 1.6657919883728秒,db中的总记录 - &gt; 200k(快速插入)

因此,在将主键从UUID.uuidString切换到其他时,插入数据所花费的时间大致相同。

所以,我的问题是,这是由于UUID.uuidString,我的数据插入随着数据在表中的增长而变慢。或者,是否有其他方法可以解决此问题,即使将主键设置为UUID.uuidString。

任何帮助都非常值得赞赏。

1 个答案:

答案 0 :(得分:0)

我已通过使用此代码解决了慢速插入问题。

func addAsBatch<T: Object>(_ data: [T]) {
    if !isRealmAccessible() { return }

    let realm = try! Realm()
    realm.refresh()

    realm.beginWrite()
    for object in data {
        realm.add(object)
    }
    try? realm.commitWrite()
}

显示示例使用的功能-

let data = TestData()
data.id = i //For 2nd test
data.legend = "02/01/17"
data.graphNum = 1346
data.xAxis = "Month"
data.yAxis = 9
data.year = "2017"

addAsBatch(data)