2017-03-23 27 views
0

我遇到了一个问题,我需要列举相对较大的数据集(> 7,000项)上的RLMResults集合。我得到这个领域懒惰地加载它的对象,因为他们被访问,但我遇到的问题是,我需要访问集合中的每一个这些项目,导致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次{做事}并释放一些内存,然后重复这个循环,直到你处理了所有的领域对象。只要你不访问对象列表中的对象,它就不会真正在内存中。 – 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]; 
     } 
    } 
}