Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 域缓慢插入数据(主键UUID().UUIString)_Ios_Swift_Database_Xcode_Realm - Fatal编程技术网

Ios 域缓慢插入数据(主键UUID().UUIString)

Ios 域缓慢插入数据(主键UUID().UUIString),ios,swift,database,xcode,realm,Ios,Swift,Database,Xcode,Realm,我正在我的一个项目中使用领域数据库。一切都很顺利,直到在其中一个表中,我必须按照领域文档中的建议将主键设置为UUID().uuidString。该应用程序有一个同步机制,它从服务器获取数据,解析JSON并插入领域数据库 在该表中,主键设置为UUID().uuidString,当数据增长超过100k时,数据插入变得非常缓慢。一开始我不知道怎么回事,这是我的代码的问题还是领域数据库的问题。因此,我创建了一个新的测试项目,并发现了当主键设置为UUID().uuidString时领域的奇怪行为 我执行了

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

在该表中,主键设置为UUID().uuidString,当数据增长超过100k时,数据插入变得非常缓慢。一开始我不知道怎么回事,这是我的代码的问题还是领域数据库的问题。因此,我创建了一个新的测试项目,并发现了当主键设置为UUID().uuidString时领域的奇怪行为

我执行了两个测试,首先将主键设置为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)
                }
        }
试试看!realm.write{
对于0..1.76628297567368秒内的i,总记录数(db->80k)(快速插入)

第三次命中->3.18893700838089秒,总记录数(db)->120k(变慢)

第四次命中->6.45702600479126秒,总记录数(db)->160k(变慢)

第五次命中->9.80401802062988秒,总记录数(db)->200k(变慢)

第6次命中->12.9913129806519秒,总记录数(db)->240k(速度越来越慢)

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

测试2:Int作为主键

执行了相同数量的交易

输出

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"
}
每个事务插入40k行数据所需的时间

第一次命中->2.36865001916885秒,总记录数(db->40k)(快速插入)

第二次命中->1.69827800989151秒,总记录数(db)->80k(快速插入)

第三次命中->1.62342000007629秒,总记录数(db)->120k(快速插入)

第四次命中->1.70833700895309秒,总记录数(db)->160k(快速插入)

第五次命中->1.6657919883728秒,总记录数(以db->200k为单位)(快速插入)

所以,在我将主键从UUID.uuidString切换到另一个之后,插入数据所用的时间大致相同

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


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

我已通过使用此代码修复了缓慢插入的问题

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

我不确定基金会的UUID是如何实现的,但可能是系统熵池被耗尽(c.f.)?如果运行相同的实验,但使用一个字符串整数(例如“123”),会发生什么情况作为您的主键?谢谢您的评论。好的,我会尝试使用字符串作为主键,并尽快更新查找结果。对此有任何更新吗?事实上,这是很久以前的事了,我已经完全忘记了我是如何修复它的。但是,我想我是在循环中执行写事务,这导致了速度缓慢。