【发布时间】:2020-12-20 23:16:10
【问题描述】:
我在 Xcode/Swift 中使用 Realm 作为基础构建了一个体育游戏。它正在运行和工作,但随着时间的推移,领域交易变得越来越慢,以至于它比我希望的要慢得多。这在本例中尤为明显。
每周有许多比赛,每个球员都有为每场比赛创建的 GameStat 对象(每周大约创建 2,000 个新的 GameStat)。
class GameStat: Object {
@objc dynamic var iden = UUID().uuidString
@objc dynamic var playerIden = "" // Links to iden of a Player Object
@objc dynamic var statOne = 0
@objc dynamic var statTwo = 0
@objc dynamic var statThree = 0
etc...
// Primary Key
override static func primaryKey() -> String? {
return "iden"
}
}
为了防止在每个游戏中多次写入领域,我在领域之外创建 GameStats(存储在 thisGameGameStats 数组中),然后在游戏完成后将这些 GameStats 批量写入领域。正是这批写入 Realm 非常慢。
try! realm.write {
for gmStat in thisGameGameStats {
realm.add(gmStat)
}
}
我测量了所用的时间,我总是看到“for”循环在 0.05 秒后完成。在前几个循环中,realm.write 函数完成没有延迟,但是在几个季节(数据库中的 c70k 记录)之后,realm.write 函数又需要 0.50 秒才能完成。
这是意料之中的,还是有机会在这里优化?
编辑:通过删除primaryKey,写入变得更快,并且似乎不会随着数据库的增长而减慢。因此,我假设在提交时会按 primaryKey 进行某种形式的排序。
【问题讨论】:
-
感谢杰伊的回复。是的,这是一个单用户离线游戏。添加到 autoreleasepool 中,它提高了内存使用率(直到现在 for 循环结束才不断上升),但仍然看到“提交”需要 0.5 秒。我对 Realm 比较陌生,但认为我上面的方法被归类为批处理事务,如 forloop in write。有没有更好的批处理方式?