领域文件大小出乎意料地大

本教程将介绍领域文件大小出乎意料地大的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

领域文件大小出乎意料地大 教程 第1张

问题描述

此问题是关于使用两种不同的方式将对象插入到领域中。我注意到第一种方法要快得多,
但与第二种方法相比,尺寸结果较大。这两种方法之间的区别是移动
将事务写入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的文件大小,同时比在单独的写入事务中添加每个对象要快得多。

好了关于领域文件大小出乎意料地大的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。