2016-12-05 3 views
2

Коллеги, теперь я разрабатываю приложение расписания автобусов и до того, как я использовал sqlite. Размер БД был 585kb, и это действительно здорово. Я решил использовать Realm, и после json parsing я вижу размер - 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

Realm и SQLite построены (и работают) совершенно по-разному.

Одной из особенностей Realm является возможность одновременного доступа к нескольким версиям базы данных из разных потоков. Это обеспечивает уровень доступа к базе данных в реальном времени и изоляцию, которая невозможна при использовании одноточечного API-интерфейса для извлечения/вставки, например, SQLite.

Чтобы разные потоки могли одновременно обращаться к различным версиям базы данных, эти разные «снимки» сохраняются в Realm по схеме копирования на запись. Как только Realm может обнаружить, что более старая версия больше не доступна, она может отметить эту часть дерева копирования на запись как «неиспользованную». Однако, чтобы предотвратить перераспределение, файл в файловой системе не усекается в этот момент, поэтому новые данные, которые записываются в Realm, могут выполняться намного быстрее.

Хорошая вещь о том, как реализована эта функция, заключается в том, что если вы не хотите ее использовать (и получить доступ к Realm, как и SQLite), нет никаких накладных расходов на хранение разных версий, и файл Realm может быть много меньше, чем эквивалентные данные, хранящиеся в SQLite.

Подробнее об этом можно узнать в Realm's docs.

+0

Супер! Спасибо за ваш замечательный ответ! Действительно очень интересно. –

Смежные вопросы