gpt4 book ai didi

cocoa - CoreData 导入期间内存使用率较高

转载 作者:行者123 更新时间:2023-12-03 16:21:40 26 4
gpt4 key购买 nike

我正在尝试执行相当大的 CoreData 导入(大约 25,000 行),同时仍然保持相当低的内存占用。我已经阅读了有关高效导入数据的文档,并努力实现其中建议的所有内容(包括将我的 MOC 的 undoManager 设置为 nil)。

不幸的是,运行以下代码时,我的应用程序内存使用量仍然攀升至 180MB 左右。完成后,无论最终的 NSAutoreleasePool 消耗调用如何,应用程序将保持在 180MB 左右。

通过分配运行应用程序显示 95% 的内存使用量归因于我的 [self.moc save:&error] 调用。我在这里做错了什么?

- (void)generateCache
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSUInteger count = 0, batchSize = 1000;

// SNIP SNIP

// Iterate over our directory structure
for(NSString *item in directoryStructure)
{
NSDictionary *info = [fm attributesOfItemAtPath:item error:nil];

FileRecord *record = (FileRecord *)[NSEntityDescription insertNewObjectForEntityForName:@"FileRecord" inManagedObjectContext:self.moc];
record.size = [NSNumber numberWithUnsignedLongLong:[info fileSize]];
record.path = item;

count ++;
if(count == batchSize)
{
NSError *error = nil;

if([self.moc save:&error])
{
NSLog(@"MOC saved down and reset");
[self.moc reset];
[pool drain];

pool = [[NSAutoreleasePool alloc] init];
count = 0;
}
}
}

// Perform any necessary last minute MOC saves
if (count != 0) {
[self.moc save:nil];
[self.moc reset];
}

// Drain our NSAutoreleasePool
[pool drain];

// Tell our main thread that we're done
if ([self respondsToSelector:@selector(completedCache)])
{
[self performSelectorOnMainThread:@selector(completedCache) withObject:nil waitUntilDone:NO];
}
}

最佳答案

与其处理自动释放池,为什么不通过使用 NSManagedObjectinitWithEntity:insertIntoManagedObjectContext: 创建托管对象来显式管理它们的生命周期?您可以在修改对象的属性后安全地释放它们,因为托管对象上下文会保留新插入的对象 - 直到将其保存到持久存储中为止。

另外,我应该提到我在您的代码中看到的几个问题:

  1. 正如上面提到的,您没有记录 save: 操作中的错误。你确实应该——这可能会突出一些(可能不相关的)问题。

  2. 如果 save: 成功,您确实不需要调用 reset。请参阅this section在核心数据指南中。

关于cocoa - CoreData 导入期间内存使用率较高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5456241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com