

Timeline(RLMObject)にネストしたTimelineItems(RLMObject) の内、  
作成日が12時間前より古いデータを一括削除するコードを書きましたが、  
データベースファイル(default.realm)のサイズが小さくなりません。

default.realmのサイズは  
・アプリインストール直後は数十KB  
・アプリを1日(24時間)使用した後は240MB(一時間毎に10MBずつ均等に増加)  
と仮定します。

RLMRealm deleteObjectで12時間前より古いデータを一括削除した場合、想定では  
・一括削除後は60MB(12/24=50%)  
となるはずですが、実際には100MB程度にしかなりません。

以下、削除するコードになります。

[code]

    RLMRealm *realm = [RLMRealm defaultRealm];
    
    // 全てのタイムラインを取得
    RLMResult *timelines = [Timeline allObjects]    
    
    // タイムラインを走査
    for (Timeline *timeline in timelines) {
    
        // timelineにネストしたモデルの内、作成日が12時間前より古いデータを取得
        CGFloat hours = 12.0f;
        NSTimeInterval secs = hours * 60.0f * 60.0f;
        NSDate *priorDate = [NSDate dateWithTimeIntervalSinceNow:secs];
        RLMResults *timelineItems = [timeline.timelineItems objectsWhere:@"(create_date <= %@)", priorDate];
    
        [realm beginWriteTransaction];
    
        // ネストした複数の子データを一括削除
        for (TimelineItem *timelineItem in timelineItems) {
    
            // ローカルに保存したキャッシュデータ(画像等)やリレーションを削除するカスタムメソッド
            [timelineItem invalidate];
    
            // RLMObjectを削除
            [realm deleteObject:timelineItem];
    
            // 削除されているか確認
            NSLog(@"isInvalited: %@", @(timelineItem.isInvalidated)); // isInvalited: 1
        }
    
        [realm commitWriteTransaction];
    }
    
[/code]

上記コードのhoursを0とし、全件削除した場合は数十KBに戻るはずですが、実際にはそうはなりませんでした。

default.realmは破棄したデータが残る仕様になっているのでしょうか?

実際のプロジェクトではより複雑な処理を行っていたり、  
モデル定義も上記モデル以外にも複数紐付いている為、  
リレーション周りが問題の可能性もありますが、  
Realm Browserで確認する限りTimelineItemのインスタンスは正常に削除されております。

実機、シミュレーター共に同様の現象が発生しております。

上記現象に関してご回答頂ければ幸いです。  
よろしくお願い致します。


CC BY-SA 3.0
2016-03-16T00:49:29.620
23180
2016-04-15T08:35:27.670
2016-03-16T07:24:59.063
5519
question
objective-c realm
RLMRealm deleteObjectで削除後、default.realmのサイズが小さくならない


Realmはデータを削除しても、元の領域は再利用のために残されます。

> ディスクスペースを効率的に再利用するために、Realmファイルのサイズはそのまま維持されることに注意してください。

<https://realm.io/jp/docs/swift/latest/#section-25>

ファイルサイズを小さくするには、コンパクションを実行します。  
コンパクションは、 `-[RLMRealm
writeCopyToPath:error:]`メソッドを使用して、新しいファイルとしてコピーすることで実行されます。  
コピー後のファイルは不要な領域が完全に削除されたサイズになります。

<https://realm.io/docs/objc/latest/api/Classes/RLMRealm.html#/c:objc(cs)RLMRealm(im)writeCopyToPath:error>:


CC BY-SA 3.0
2016-03-16T05:18:34.343
23183
2016-03-16T05:18:34.343
5519
23180
answer