gpt4 book ai didi

swift - 意想不到的大 Realm 文件大小

转载 作者:搜寻专家 更新时间:2023-10-30 22:30:23 26 4
gpt4 key购买 nike

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

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

当我像这样添加对象时,Realm 文件增长到 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")
}
}

当我像这样添加对象时,Realm 文件只增长到 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")
}
}

我的类添加到 Realm 文件

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
}

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

最佳答案

在单个事务中添加所有对象时的大文件大小是由于 Realm 的事务日志子系统和 Realm 的大 blob 内存分配算法之间的不幸交互。 Realm 的内存布局算法要求文件大小至少是 Realm 文件中存储的最大单个 blob 大小的 8 倍。事务日志条目总结了单个事务期间所做的修改,在 Realm 文件中存储为 blob。

当您在一个事务中添加 40,000 个对象时,您最终会得到一个大小约为 5MB 的事务日志条目。这意味着文件的大小必须至少为 40MB 才能存储它。 (我不太确定它是如何再次变成几乎两倍大小的。可能是 blob 大小在这条线上的某处四舍五入为 2 的幂……)

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

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

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

关于swift - 意想不到的大 Realm 文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46228149/

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