【问题标题】:iOS, Core Data: Memory IssuesiOS,核心数据:内存问题
【发布时间】:2014-05-07 15:23:33
【问题描述】:

我正在将旧的大型 sqlite 数据库转换为核心数据,现在我面临内存问题。

-(void)linkCoinsToCoinagesInPeriods
{
DBAccess *acc=[[DBAccess alloc]init];
NSFetchRequest *coinagesFetch=[NSFetchRequest fetchRequestWithEntityName:@"Coinage"];
NSArray *coinages=[_context executeFetchRequest:coinagesFetch error:nil]; // 2000+ items

for(Coinage *coinage in coinages)
{
    //retrieving different quantity of int objects less then 200 from database

    NSMutableArray *coinsArr=[acc returnKMListFromCoinageCell:1 period:coinage.uID.intValue];

    for(dbType *obj in coinsArr)
    {
        NSFetchRequest *coinsFetch=[NSFetchRequest fetchRequestWithEntityName:@"Coin"];
        NSPredicate *predicate=[NSPredicate predicateWithFormat:@"uID=%@",[NSNumber numberWithInt:obj.kmID]];
        coinsFetch.predicate=predicate;
        NSArray *coins=[_context executeFetchRequest:coinsFetch error:nil];
        for(Coin *coin in coins)
        {
            coin.coinage=coinage;
            NSLog(@"Linked coin to coinage: %@ -> %@",coin.uID, coinage.name);
        }
        coinsFetch=nil;
    }
    coinsArr=nil;
    [self saveContext];

}
}

在我开始运行此方法的同时,我的处理器显示为 97%,第一分钟后内存消耗大约为 108.1 MB。

最后,Xcode 抛出了我:

CoreData: 错误: (21) 数据库 I/O 错误位于 /Users/ia/Library/Application Support/iPhone Simulator/7.0.3/Applications/C5CCADE1-9FDD-4A03-BC44-FAD1C16DB0EF/Documents/Catalog/ wci.sqlite。 SQLite 错误代码:21,'无法打开数据库文件'

坦率地说,我在我的代码中找不到缺陷。最近写了类似的方法,插入20000个对象后内存大约50MB。有什么帮助吗?提前谢谢你

【问题讨论】:

  • stackoverflow.com/questions/18550873/… 。参考我的回答,如果对你有帮助,请采纳。
  • 不太有帮助,但是好主意是在插入 N 次后重置上下文。我会接受你的回答,但首先你应该在这里提交一个。

标签: ios xcode sqlite core-data memory


【解决方案1】:

ios Coredata large set insert

[thisContext setUndoManager:nil]; 这是捕获线。 UndoManager 占用大量内存。插入时不需要撤消管理器,将其设置为 null 会减少内存+在很大程度上增加插入。

【讨论】:

  • 谢谢。 UndoManager 在这种情况下是没有用的。
猜你喜欢
  • 2012-02-12
  • 2014-07-24
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多