领域文件大小出乎意料地大 [英] Unexpectedly large Realm file size

查看:46
本文介绍了领域文件大小出乎意料地大的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题是关于使用两种不同的方式将对象插入到领域中。我注意到第一种方法要快得多, 但与第二种方法相比,尺寸结果较大。这两种方法之间的区别是移动 将事务写入for循环外部与内部。

// Create realm file
let realm = try! Realm(fileURL: banco_url!)

当我像这样添加对象时,领域文件增长到75.5MB:

try! realm.write {
    for i in 1...40000 {
        let new_realm_obj = realm_obj(value: ["id" : incrementID(),
                                              "a": "123",
                                              "b": 12.12,
                                              "c": 66,
                                              "d": 13.13,
                                              "e": 0.6,
                                              "f": "01100110",
                                              "g": DateTime,
                                              "h": 3])

        realm.add(new_realm_obj)
        print("🔹 (i) Added")
    }
}

当我像这样添加对象时,领域文件仅增长到5.5MB:

for i in 1...40000 {
    let new_realm_obj = realm_obj(value: ["id" : incrementID(),
                                          "a": "123",
                                          "b": 12.12,
                                          "c": 66,
                                          "d": 13.13,
                                          "e": 0.6,
                                          "f": "01100110",
                                          "g": DateTime,
                                          "h": 3])
    try! realm.write {
        realm.add(new_realm_obj)
        print("🔹 (i) Added")
    }
}

要添加到领域文件的我的类

class realm_obj: Object {
    dynamic var id = Int()
    dynamic var a = ""
    dynamic var b = 0.0
    dynamic var c = Int8()
    dynamic var d = 0.0
    dynamic var e = 0.0
    dynamic var f = ""
    dynamic var g = Date()
    dynamic var h = Int8()
}

自动递增功能

func incrementID() -> Int {
    let realm = try! Realm(fileURL: banco_url!)
    return (realm.objects(realm_obj.self).max(ofProperty: "id") as Int? ?? 0) + 1
}

有没有更好的或正确的方法来做这件事?为什么在这些情况下我会得到如此不同的文件大小?

推荐答案

在单个事务中添加所有对象时文件大小很大,这是由于领域的事务日志子系统与领域的大型Blob的内存分配算法之间的交互造成的。领域的内存布局算法要求文件大小至少是领域文件中存储的最大BLOB大小的8倍。事务日志条目(汇总单个事务期间所做的修改)作为Blob存储在领域文件中。

当您在一个事务中添加40,000个对象时,最终得到的单个事务日志条目大小约为5MB。这意味着该文件的大小必须至少为40MB,才能存储它。(我不太确定它怎么会再次接近那个大小的两倍。可能是沿着线…)某处的斑点大小四舍五入为2的幂)

当您在40,000个事务中添加一个对象时,最终仍然只有一个事务日志条目,这一次它的大小约为100个字节。之所以会发生这种情况,是因为当领域提交事务时,它会先尝试回收未使用的事务日志条目,然后再为新条目分配空间。由于领域文件未在其他位置打开,因此可以在每次执行新提交时回收以前的条目。

realm/realm-core#2343跟踪改进领域存储事务日志条目的方式,以避免您看到的严重过度分配。

就目前而言,我的建议是将这两种方法的不同之处分开,并为每个写事务添加对象组。这将通过增加提交次数来牺牲一些性能,但会通过减少您创建的最大事务日志条目的大小来减少内存布局算法的影响。从快速测试来看,每提交2,000个对象会产生大约4MB的文件大小,同时比在单独的写入事务中添加每个对象要快得多。

这篇关于领域文件大小出乎意料地大的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆