gpt4 book ai didi

swift - 如何使用 Realm 提高大型数据集的性能?

转载 作者:行者123 更新时间:2023-11-30 10:01:20 27 4
gpt4 key购买 nike

我的数据库有 500,000 条记录。这些表没有主键,因为 Realm 不支持复合主键。我在后台线程中获取数据,然后我想将其显示在主线程的 UI 中。但由于 Realm 对象无法跨线程共享,因此我无法使用在后台获取的记录。相反,我需要在主线程上重新获取记录?如果我从 500,000 条记录中获取一条记录,它将阻塞主线程。我不知道该如何处理。我使用 Realm 因为它说它足够快。如果我需要多次重新获取记录,它真的比 SQLite 更快吗?我不想创建另一个将其他列组合为主键的属性,因为 Realm 数据库已经比 SQLite 文件大。

@objc class CKPhraseModel: CKBaseHMMModel{
dynamic var pinyin :String!
dynamic var phrase :String = ""

class func fetchObjects(apinyin :String) -> Results<CKPhraseModel> {

let realm = Realm.createDefaultRealm()

let fetchString = generateQueryString(apinyin)
let phrases = realm.objects(self).filter(fetchString).sorted("frequency", ascending: false)

return phrases
}

func save(needTransition :Bool = true) {

if let realm = realm {
try! realm.write(needTransition) {[unowned self] in
self.frequency += 1
}
}
else {
let realm = Realm.createDefaultRealm()
if let model = self.dynamicType.fetchObjects(pinyin).filter("phrase == %@", phrase).first {
try! realm.write(needTransition) {[unowned self] in
model.frequency += self.frequency
}
}
else {
try! realm.write(needTransition) {[unowned self] in
realm.add(self)
}
}
}
}
}

然后我将获取的记录存储在数组中

let userInput = "input somthing"
let phraseList = CKPhraseModel().fetchObjects(userInput)
for (_,phraseModel) in phraseList.enumerate() {
candidates.append(phraseModel)
}

然后,当用户单击其中之一时,我想在 UI 中显示 candidates 信息。我将调用 CKPhraseModel 的 save 函数来保存更改。此步骤在主线程上。

最佳答案

如果您使用其延迟加载功能,Realm 会很快,这意味着您创建一个过滤器,直接从 Realm 返回您的候选,因为这样您只需要检索元素您在结果中建立索引。

在您的情况下,您复制所有元素。这有点慢,这就是你最终卡住的原因。

关于swift - 如何使用 Realm 提高大型数据集的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38352016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com