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

标签 swift realm

我的数据库有 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/

相关文章:

ios - 找不到 Firebase 的 PhoneAuthProvider 类

iOS swift闹钟重复功能表

ios - 如何正确加载数千条记录到Realm?

swift - 使用 Realm Swift 排序问题

ios - 来自 mysql json 结果的 Realm iOS 关系

swift - 计时器不在 Swift 3.0 Playground 上运行

swift - 使用 Codable 时,如何在枚举 CodingKeys 中指定要解码的多种类型?

android - Realm 对象在 android 中失效

swift - 将 Firebase 快照分配给变量

android - 如何检查 android 数据存在的 Realm ?