巨大的核心数据对象
我试图将200k消息添加到核心数据对象以获取Twitter应用程序的概念证明。这效果很好,我的实体被添加。我有一个UISearchBar
和一个UITableView
来显示这些。但是,对于每一个新的1000个物体,我的时间似乎都呈指数增长。这是正常的吗?我预计CoreData
对于庞大的数据集表现不错。你有更好的建议来处理这么庞大的数据集。我想知道,Dictionary apps
如何工作。巨大的核心数据对象
我的控制台输出是在这里:
-2012-03-26 22:19:28.126 TweetReader [3668:707]完成1000
-2012-03-26 22:19:40.335 TweetReader [ 3668:707]完成2000
-2012-03-26 22:19:55.136 TweetReader [3668:707]完成3000
-2012-03-26 22:20:18.569 TweetReader [3668:707]完成4000
-2012-03-26 22:20:50.166 TweetReader [3668:707]完成5000
-2012-03-26 22:21:30.284 TweetReader [3668:707]完成6000
-2012-03-26 22:22:19.096 TweetReader [3668:707]完成7000
-2012-03-26 22:23:16.091 TweetReader [3668:707]完成8000
-2012-03-26 22:24:21.321 TweetReader [3668:707]完成9000
-2012-03-26 22:25:35.017 TweetReader [3668:707]完成10000
-2012-03-26 22:26:57.250 TweetReader [3668 :707]完成11000
-2012-03-26 22:28:27.563 TweetReader [3668:707]完成12000
-2012-03-26 22:30:06.202 TweetReader [3668:707]完成13000
- 2012-03-26 22:31:52.645 TweetReader [3668:707]完成14000
这是我的代码保存为CoreData
:
for (NSInteger i = 1; i <= 200000; i++) {
NSAutoreleasePool * myPool = [[NSAutoreleasePool alloc] init];
Tweet *tweetie = [NSEntityDescription insertNewObjectForEntityForName:@"Tweet" inManagedObjectContext:self.managedObjectContext];
tweetie.name = [NSString stringWithFormat:@"%10d",i];
tweetie.message =[NSString stringWithFormat:@"%10d",i];
// Save the context after 1000 objects.
if (! (i % 1000)) {
NSError *error;
NSLog(@"Done %d",i);
if (![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[myPool release];
}
}
哪些列,你有你的索引数据库?您是否尝试过在添加上下文时锁定上下文以查看它是否可以优化此操作(即,事务性插入?)
核心数据在批量插入时出了名。解决这个问题的方法可能就是直接使用sqlite - 看到这篇文章是为了一个真实生活中需要这样做的人的案例研究:http://inessential.com/2010/02/26/on_switching_away_from_core_data
嘿,如果你有200k消息,首先找到最佳存储长度你的每条消息。这将是试验和错误,我发现3000是最佳的。执行[保存上下文]每3000例如:
for(i=0; i<num of objects;i++)
{ // form the object to be saved in context
if(i%3000==0){ // save the num of records , optimum value
NSError *error;
NSLog(@"saved rec nu %d",i);
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
return NO;
}
[context processPendingChanges];// most important thing , if not objects will
// keep adding in context and time would for insertion would drastically increase.
}
//for last set of the objects which are less than 3000
NSError *error;
NSLog(@"saved rec nu %d",i);
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
return NO;
}
让我知道,如果有什么..
谢谢..但很久很久以前我转换为sqllite .. – Pungs 2014-02-03 06:10:42
你抱怨的增加是缓慢的,或一旦与数据集中工作,这是完整的? – jrturton 2012-03-26 16:33:45
此外,您正在为循环的每次迭代创建一个新的自动释放池 - 这是一个坏主意。 – jrturton 2012-03-26 16:34:46
加入缓慢。花了将近2小时才将200k个物体添加到实际的iPhone 3gs上。 – Pungs 2012-03-26 17:12:05