【发布时间】:2014-01-15 21:56:20
【问题描述】:
我正在将数百 MB 文件集加载到 Core Data 中。我没有使用关系连接,而是发现通过创建 NSDictionaries / NSArray 并将它们序列化到核心数据记录上,我可以获得更好的性能。到目前为止的问题是我的内存占用空间由于 ot malloc 归因于这一行:
NSMutableDictionary *stackEntryDictionary = [NSMutableDictionary dictionary];
NSDictionary *stackDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithUTF8String:parts[6].c_str()], @"relationship"
, [NSString stringWithUTF8String:parts[8].c_str()], @"sequenceId"
, [NSString stringWithUTF8String:parts[9].c_str()], @"sequence"
, [NSString stringWithUTF8String:parts[7].c_str()], @"block"
, [NSNumber numberWithInteger:row], @"entryId"
, nil ];
if ([relationship isEqualToString:@"consensus"] || [relationship isEqualToString:@"model"]) {
[stackEntryDictionary setObject:stackDictionary forKey:relationship];
row = 1;
}
else {
[stackEntryDictionary setObject:stackDictionary forKey:[NSNumber numberWithInt:row].stringValue];
++row;
}
stackEntryDatumMO = [NSEntityDescription insertNewObjectForEntityForName:@"StackEntryDatum" inManagedObjectContext:document.managedObjectContext];
stackEntryDatumMO.sampleId = sampleMO.sampleId;
stackEntryDatumMO.name = sampleMO.name;
stackEntryDatumMO.tagId = [NSNumber numberWithInteger:locusId];
// THIS IS THE "BAD LINE" that issues a lot of NSString malloc's
stackEntryDatumMO.stackData = [NSJSONSerialization dataWithJSONObject:stackEntryDictionary options:0 error:&error];
当我完全脱离循环时(每个文件大约 70K,30 个文件,插入字典的平均大小约为 20),这将被清除。但是,我正在使用大约 10 GB 的内存,这会降低应用程序的性能并且是不必要的。
所以,我有两个问题: 1 - 你会如何建议我将对象嵌入核心数据(或者你建议)? 2 - 是否有更好的 JSON 序列化库可以提供更低的内存占用? 3 - 我应该放弃 ARC 吗?如果是,怎么办? 4 - 还有其他建议吗?使用单独的导入“应用程序”将是一种可能的替代临时解决方案,但不是我愿意长期在 App-Store 上看到的东西。
我还应该提到,当 ARC 在加载后清理时,它会在尝试释放已释放的对象时终止应用程序(如果需要,可以稍后发布错误)。这不会发生在较小的文件上。
【问题讨论】:
-
使用
@autoreleasepool -
是的,在 dataWithJSONObject 调用周围放置一个自动释放池。 (假设 stackData 是“强”。)
标签: objective-c json core-data automatic-ref-counting nsdata