我有一個巨大的NSArray(4.000.000對象),我想保存到核心數據。 因爲我使用ARC並且autorelease池可能會變得太大,我將該進程劃分爲多個循環(所以autorelease池可能有機會耗盡自己)。如何在CoreData中正確添加大型數據集?
在下面的代碼中,我使用管理器(clMan)從數組(區域)內的字典中添加項目。字典包含兩個字符串字段,它們被解析爲標量整數。
代碼將數據劃分爲多個環路
int loopSize = 50000;
int loops = 0;
int totalRepetitions = regions.count;
loops = totalRepetitions/loopSize;
int remaining = totalRepetitions % loopSize;
loops += 1;
for (int i = 0; i < loops; i++) {
int k = 0;
if (i == 0) k = 1;
if (i == (loops - 1))
{
// Last loop
for (long j = i * loopSize + k; j < i * loopSize + remaining; j++) {
[clMan addItemWithData:[regions objectAtIndex:j]];
}
[clMan saveContext];
break;
}
// Complete loops before the last one
for (long j = i * loopSize + k; j < (i + 1) * loopSize; j++) {
[clMan addItemWithData:[regions objectAtIndex:j]];
}
[clMan saveContext];
NSLog(@"Records added : %d", i * loopSize);
}
NSLog(@"Finished adding into core data");
,用於將數據轉換成核心數據編碼:
-(void)addItemWithData:(NSDictionary *)data
{
MyRegion *region = [NSEntityDescription
insertNewObjectForEntityForName:@"MyRegion"
inManagedObjectContext:self.context];
region.index = [((NSString *)[data objectForKey:REGION_INDEX]) intValue];
region.id = [((NSString *)[data objectForKey:REGION_ID]) intValue];
}
程序崩潰當它達到1 500 000指數。由於解析問題/邏輯,崩潰似乎不會發生。
任何人都可以告訴我,如果我的邏輯是壞的或者什麼是在CoreData中添加這些數據量的正確方法?
你有沒有想過使用魔法記錄這個?它具有非常好的自動導入數組和字典數據的設置。 – Fogmeister
除非你用'@autoreleasepool {}'來包裝它們,否則你的循環將無濟於事。您還需要像邁克爾羅斯在他的回答中所說的那樣「重置」MOC。 –