Realm Objective‑C & Swift 0.101 – 日付型をナノ秒までサポート、メモリ使用量の減少、マルチプロセスにおけるクラッシュの取り扱いを改善
このバージョン(0.101)で読み書きを行ったRealmファイルは自動的にフォーマットがアップグレードされ、以前のバージョンで開くことができなくなります。既存アプリケーションに対して更新を適用する場合は特に注意してください。
Realm Objective‑CおよびRealm Swift 0.101をリリースしました。
このバージョンでは、これまでずっと存在していた、日付型の精度の制限を取り除きました。さらに、メモリマップの際のメモリ使用量の削減とマルチプロセスにおけるクラッシュの取り扱いを改善しました。
ナノ秒までの精度の日付 & 新しいファイルフォーマット
これまでは、NSDate
型のプロパティはミリ秒以下は切り捨てられていました。そのため、ミリ秒の精度を求めるアプリケーションにおいては、正しく動作しませんでした。このバージョンではNSDate
よりもさらに高い精度の新しい日付のフォーマットが含まれています。日付型のプロパティは完全な精度を保持できるようになりました。
新しい日付型のフォーマットを利用するためには、Realmファイルを完全に新しいフォーマットに更新する必要があります。つまり、このバージョンで読み書きしたRealmファイルは以前のバージョンでは開くことができなくなります。既存のファイルは、読み取り専用のAppバンドル内のファイルを開いたとき以外は、このバージョンで開いたときに自動的にアップグレードされます。Realm Browserでファイルを開いたときも同様にアップグレードされます。リリース済みのアプリケーションに対して更新をする場合は、特に注意してください🚨
マルチスレッドにおけるメモリマップのオーバヘッドを削減
以前のバージョンのRealmではトランザクションを隔離するために、スレッドごとにファイル全体をmmap
する必要がありました。これは他のデータ永続化フレームワークがよく備えている「フォールト」という概念をRealmが持たない理由です。
このバージョンでは、複数のスレッドから一つのRealmファイルを開いている場合は、一つのメモリマップをすべてのスレッドで共有するようになりました。このため、特に大きなサイズのファイルを取り扱う際に、非常にメモリの必要量を削減することができます。
複数プロセス間のクラッシュの取り扱いを改善
同じファイルに対して複数のプロセスがトランザクションを実行している際に、あるプロセスがクラッシュした場合に、他のプロセスをブロックしないようになりました。
以前に掲載した、Fast Inter-Process CommunicationとRealm 0.91リリースの記事に書かれた、Darwinはプロセス間の堅牢なMutexをサポートしていないという事実を覚えていますでしょうか。そのため、私たちはRealmの最も基本的なロックの仕組みを、fcntl(3)
を使い再実装し、POSIXのAPIを完全にサポートしないプラットフォームでも動作する、堅牢なプロセス間のMutexをエミュレートしました。
このことにより、ロックを持ったプロセスがクラッシュした場合でも、他のプロセスをロックすることがなくなりました。
その他の改善
複雑な関連を持ったオブジェクトに対する通知のパフォーマンスを大幅に改善しました。同時に、Results
/RLMResults
に対する更新(自動更新を含む)のパフォーマンスも向上しました。
不具合の修正
RLMArray
またはList
が異なるスレッドで解放された際のクラッシュを修正しました。
お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)、 Slack(日本語)、Twitter(日本語)、GitHub(英語)でご相談ください。