2016-07-14 4 views
0

サイトを保管するiOS-Appを作成しています。サイトごとに異なるアドレスがあります。テストのために私は32kサイトと32kアドレスを作成しました。最初にすべてのデータポイントを作成したとき、レルムファイルは約9GBのデータを占めていました。このデータを保存するのに必要なスペースについては、テストを何度か再実行します。レルム同じデータが保存されるにもかかわらず、ファイルサイズが異なる

これらのテストを実行するたびに、ファイルサイズが25mbから10gbの範囲で異なります。私は確信していませんが、問題はどうなっているようです。私が探すかもし​​れない提案がありますか?

+0

Realmインスタンスをバックグラウンドスレッドで閉じることは間違いありません。 1つのトランザクションだけでなく、複数のトランザクションを使用しているかもしれません。 – EpicPandaForce

+0

@EpicPandaForceあなたは部分的に正しいです。私は実際には複数のトランザクションを使用していましたが、私が知る限り、迅速に領域のインスタンスを閉じる方法はありません。 – TheKringar

+0

@EpicPandaForceなぜ、サイズが大きくてそのようにランダムになるのか説明できますか?なぜなら、私が複数の取引をしているのか、まったく同じ取引をしているのかは関係ありません。 – TheKringar

答えて

1

私はRealm-SwiftよりもRealm-Javaに精通していますが、自分自身を更新できない非ループスレッドに属するRealmの古いインスタンスを保持していると(素早く、バックグラウンドスレッドとディスパッチキュー)では、Realmインスタンスを閉じる必要があります。すぐに、Realmを自動クローズするためにautoreleasepoolにラップする必要があります。この動作に関連するdocumentationがここにあります。

Realmファイルのデータの中間バージョンは、Realmオブジェクトが割り当て解除されるまで再利用できません。この問題を回避するには、ディスパッチキューからレルムにアクセスするときに、明示的な自動解放プールを使用する必要があります。

また、特定のバックグラウンドスレッドで実行するトランザクションの数を減らすと役立つと思います。

保存された古いバージョンには追加の領域が必要ですが、これはcompactRealmを使用して圧縮できます。これを実行するには、すべてのスレッドですべてのRealmインスタンスを終了する必要があります。

+0

説明をくれてありがとう、それは私に多くの助けになります – TheKringar

2

ファイルサイズが保存するデータ量よりも大幅に多い場合は、version pinningという問題が発生している可能性があります。

バージョン固定は、他のスレッドが新しいデータを書き込んでいる間に、Realmインスタンスが予想以上に長く滞在している場合です。 Realmインスタンスは、最新のバージョンに割り当て解除またはリフレッシュされるまで、見ているデータのバージョンを維持します。別のスレッドがRealmインスタンスを古いバージョンで開いているときに、1つのスレッドがレルムにデータを書き込んでいる場合、新しいデータは古いデータを上書きできないため、ファイルサイズが増大します。 Realmインスタンスの割り当てが解除されるか、現在のバージョンに進むと、Realmファイル内の古いバージョンの領域は空きとしてマークされ、後続の書き込みに再利用できます。

バージョンの固定につながる一般的な状況の1つは、ディスパッチキューでRealmを使用し、Realmインスタンスがディスパッチキューの自動解放プールで終了する場合です。ディスパッチキューにより、自動解放プールが比較的頻繁に排除され、Realmインスタンスの存続期間が予想以上に長くなる可能性があります。このクラスの問題を回避するために、ディスパッチキュー上のRealmに関連するすべての作業を、自動解放プールで明示的にラップすることをお勧めします。これにより、Realmインスタンスがタイムリーに解放されます。

+0

答えは実際にはまあまあですが、残念ながら私は2つを受け入れることができず、もう1つが最初であったので、私はそれを受け入れました – TheKringar

関連する問題