2016-06-07 9 views
2

Ich arbeite derzeit an einem iOS-Projekt in Swift und ich verwende Realm für meine Datenbank. Ich speichere ein Realm-Objekt mit einem seiner Attribute als NSData-Objekt (eigentlich ist es ein UIImage, das ich in NSData konvertiert habe).Übermäßiger Unterschied in Realm Dateigröße beim Speichern verschiedener NSData

Mein Problem ist ziemlich einfach zu verstehen: Wenn ich ein NSData-Objekt mit der Größe 3 Mo speichere, liegt meine Realm-Dateigröße bei 15 Mo. Aber wenn meine NSData-Objektgröße 6 Mo ist, wird meine Realm-Dateigröße ungefähr 80 Mo.

Hat jemand dieses Problem erlebt? Gibt es einen Grund für diesen Unterschied? Gibt es eine Möglichkeit, das zu beheben?

Antwort

3

Die Realm-Dateigröße entspricht nicht der Größe der Daten, die aus bestimmten Gründen gespeichert werden.

Eins ist interne Versionen von Daten.

If your Realm file is much larger than you expect, it may be because you have a RLMRealm that is referring to an older version of the data in the database.

In order to give you a consistent view of your data, Realm only updates the active version accessed at the start of a run loop iteration. This means that if you read some data from the Realm and then block the thread on a long-running operation while writing to the Realm on other threads, the version is never updated and Realm has to hold on to intermediate versions of the data which you may not actually need, resulting in the file size growing with each write. The extra space will eventually be reused by future writes, or may be compacted — for example by calling writeCopyToPath:error: .

https://realm.io/docs/objc/latest/#file-size--tracking-of-intermediate-versions

, auch

on mobile platforms, Realm file size start at 4KB and double in size every time more than the current allocation is required. This doubling stops at 32MB, at which point the file grows in increments of 16MB. So 16MB -> 32MB -> 48MB.

https://github.com/realm/realm-cocoa/issues/2631#issuecomment-145566190

Deshalb ist die Dateigröße ist größer als erwartet.

Um zu optimieren (um alle freien Speicherplatz zu entfernen) Realm Dateigröße, können Sie writeCopyToPath:error: Methode verwenden. Die kopierte Datei wird komprimiert.

Verwandte Themen