Tag: 存储器

核心数据导入 – 不释放内存

我的问题是关于核心数据和内存不被释放。 我正在做一个同步过程从一个返回一个JSON的WebService导入数据。 我在内存中加载要导入的数据,循环并创buildNSManagedObjects。 导入的数据需要创build与其他对象有关系的对象,总共有11.000个左右。 但是为了隔离这个问题,我现在只创build第一层和第二层的项目,把这个关系留下来,这些是9043个对象。 我开始检查使用的内存量,因为应用程序在进程结束时崩溃(使用完整的数据集)。 第一次内存检查是在内存中加载json之后,以便测量真的只考虑创build,并将对象插入到核心数据中。 我用来检查使用的内存是这个代码( 源 ) – (void)get_free_memory { struct task_basic_info info; mach_msg_type_number_t size = sizeof(info); kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)信息, &尺寸); 如果(kerr == KERN_SUCCESS){ NSLog(@“Memory in use(in bytes):%f”,(float)(info.resident_size / 1024.0)/1024.0); } else { NSLog(@“Error with task_info():%s”,mach_error_string(kerr)); } } 我的设置: 1个持久店铺协调员 1 Main ManagedObjectContext(MMC)(NSMainQueueConcurrencyType用于读取(只读)应用程序中的数据) 1后台ManagedObjectContext(BMC)(NSPrivateQueueConcurrencyType,undoManager设置为nil,用于导入数据) BMC独立于MMC,所以BMC不是MMC的子环境。 而且他们不共享任何家长的上下文。 我不需要BMC通知MMC的更改。 所以BMC只需要创build/更新/删除数据。 者平台: […]

核心导入大型数据集时的数据内存使用情况

我现在用一个令人讨厌的核心数据问题困住了大约两个星期。 我阅读了大量的博文,文章和问题/答案,但仍然无法解决我的问题。 我跑了很多testing,并能够将较大的问题减less到一个较小的问题。 这将是一个很大的解释,所以跟我保持! 问题 – 数据模型 我必须得到以下datamodel : 对象A与对象B有一对多的关系,与对象C有另一个一对多的关系。由于核心数据的build议,我必须创build反向关系,所以B的每个实例指向它的父对象A, C指向其父B. A <->> B <->> C 问题 – MOC设置 为了保持响应顺畅,我创build了一个三级的managedObjectContext结构。 父MOC – 使用NSPrivateQueueConcurrencyType在其自己的专用线程上运行,对于persistentStoreCoordinator MainQueue MOC – 使用NSMainQueueConcurrencyType在mainThread上运行,并具有父MOC 1 对于每个parsing操作,我创build了第三个MOC,它也有它的私有队列,并具有父mainQueue MOC 我的主数据控制器作为观察者被添加到MOC 2的NSManagedObjectContextDidSave通知中,所以每当MOC 2保存一个performBlock:在MOC1被触发,执行一个保存操作(由于performBlock:asynchronous)。 问题 – parsing 为了将一个大的JSON文件parsing到我的核心数据结构中,我写了一个循环parsing器。 这个parsing器首先创build一个新的MOC(3)。 然后它获取对象A的数据并parsing其属性。 然后parsing器读出B的JSON关系,并创build填充数据的相应对象。 这些新的对象通过调用addBObject: A添加到A.因为parsing器是经常性的,所以parsingB意味着parsingC,这里也创build新的对象并将其附加到B.这一切都发生在MOC 3的performBlock:上。 parsing(创build'A'对象并开始parsingB) parsingA(创build'B'对象,将它们附加到A并开始parsingC) parsingB(创build'C'对象,将它们附加到B) parsingC(仅将数据存储在C对象中) 在每个parsing操作之后,我保存MOC 3,并在mainThread上调度主MOC(2)的保存操作。 由于NSManagedObjectContextDidSave通知,MOC 1将自动保存为asynchronous。 if (parsed){ NSError *error […]

在每个核心数据项上执行任务时,如何避免内存不足?

我正在尝试执行类似下面的任务: NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entry"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(version == %@)", @"1.0"]; [request setPredicate:predicate]; NSArray *results = [[AppDelegate applicationDelegate].managedObjectContext executeFetchRequest:request error:nil]; int i = 0; while (i < results.count) { Entry *entry = [results objectAtIndex:i]; entry.version = @"1.1"; i++; } 但是,在获得每一个结果之前,它将耗尽内存。 我知道这一点: [request setFetchBatchSize:20]; 但是我想知道如何与我的工作? 在20次结果之后会停止处理,还是只抓取前20个结果,然后抓住接下来的20个结果继续? 我所要求的基本上是我如何只抓取一定数量的数据,停止内存耗尽,然后抓另一批?