我在我的一个项目中使用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。
任何帮助都非常值得赞赏。
答案 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)