2016-12-05 57 views
2

同事,現在我開發了一個公交時間表的應用程序,並在我使用sqlite之前。 DB的大小是585kb,它非常酷。我決定使用Realm,在json解析之後,我看到大小爲-9,6Mb(超過大約20倍)。 請告訴我爲什麼?這對我來說不是問題,但它很有趣!代碼爲什麼.sqlite DB的大小比Realm小得多?

例如:

self.realm.beginWrite() 

let file = Bundle.main.path(forResource: "file", ofType: "json")! 
let url = URL(fileURLWithPath: file) 
let jsonData = NSData(contentsOf: url)! 
let json = try! JSONSerialization.jsonObject(with: jsonData as Data, options: [])       
self.realm.create(DataRoot.self, value: json, update: true)     
try! self.realm.commitWrite() 
+0

您可能沒有關閉Realm實例,並將每個元素插入新事務而不是一個事務。 – EpicPandaForce

+0

不,Realm的大小是不變的,我在Realm瀏覽器中看到它,我的Android同事也看到它的大小。 –

+0

沒有交易代碼,沒有什麼可說的 – EpicPandaForce

回答

3

境界和SQLite是建立(和操作)有很大不同。

Realm的一個特性是允許從不同線程的多個版本的數據庫進行無鎖併發訪問。這爲SQLite提供的單點提取/插入數據庫API提供了對數據庫和隔離的實時訪問級別。

爲了允許不同的線程同時訪問不同版本的數據庫,這些不同的「快照」按照寫時複製方案存儲在Realm中。只要Realm能夠檢測到舊版本不再被訪問,它就可以將寫入時複製樹的那部分標記爲「未使用」。但是,爲了防止過度分配,此時文件系統上的文件不會被截斷,因此寫入Realm的新數據可以更快地完成。

這個特性實現方式的好處是,如果你不想使用它(並且像SQLite那樣訪問Realm),那麼存儲不同版本就沒有任何開銷,並且Realm文件可能很多小於存儲在SQLite中的等效數據。

你可以在Realm's docs瞭解更多。

+0

超級!感謝您的驚人答案!真的很有意思。 –

相關問題