2017-03-23 11 views
0

RLMResultsコレクションを比較的大きなデータセット(> 7,000アイテム)に列挙する必要がある問題が発生しています。私はその領域にオブジェクトがアクセスされたときにそのオブジェクトをゆっくりとロードしますが、私が実行する問題は、コレクション内のこれらの各アイテムにアクセスして7,000以上のアイテムをメモリにロードし、メモリエラー。領域のドキュメントによると、クエリの結果の制限はサポートされていません。大きなデータセットでRLMResultsを使用した高速列挙

ファイルシステムからファイルを取り出して削除することが必要な場合があります。はい、述語を使用してクエリを実行し、キャッシュされたアイテムのみを要求できますが、最悪の場合のシナリオでは、ライブラリ内のすべてのアイテムを返すことができます。これを緩和するために

RLMResults<DLLibrary *> *allItems = [DLLibrary allObjects]; 
for(DLLibrary *item in allItems) { 
    // My understanding is that once the realm object is ready, it will be 
    // lazily loaded into memory. If I have many 1,000's of items in my data 
    // store this quickly becomes a problem memory wise. 
    if(item.isCached) { 
    [[DLCacheService instance] deleteCachedFileWithDocumentId:item.id]; 
    } 
} 
+0

何が起こっているかについては、いくつかのコードを見たり、より明確なアイデアを持っているとよいでしょう。なぜあなたはすべてのオブジェクトにアクセスする必要がありますし、一度アクセスすると何をしていますか? –

+0

これはRLMResults <>コレクションを使った単純なfor-inループです。私の場合は、サーバーから更新データセットを取得し、削除する必要があるアイテムをチェックする必要があります(たとえば、現在のアイテムIDがサーバーから返されたデータセットに含まれているかどうかを確認します。私が何をしているのかに関わらず、すべてのオブジェクトに対して実行する必要がある計算である可能性があります。他の人が潜在的にやっていることを見たいと思っています。 –

+0

これは遅延ロードされているので、for_inの代わりに何ができるのかは、実際にアイテムをページ付けする場所です。 '100回{do things} 'を実行してメモリーを解放し、すべての領域オブジェクトを処理するまでこのループを繰り返すことができます。オブジェクトのリストからオブジェクトにアクセスしない限り、実際にはメモリには格納されません。 – Kalzem

答えて

1

最も簡単な方法は、明示的にその内容を確認し終わったら、あなたはレイジー・ロードされたオブジェクトが速やかに解放される保証する@autoreleasepoolブレースを使用することであろう。 :)

RLMResults<DLLibrary *> *allItems = [DLLibrary allObjects]; 
for (NSInteger i = 0; i < allItems.count; i++) { 
    @autoreleasepool { 
     DLLibrary *item = allItems[i]; 
     if (item.isCached) { 
      [[DLCacheService instance] deleteCachedFileWithDocumentId:item.id]; 
     } 
    } 
} 
関連する問題