巨大的核心数据对象

问题描述:

我试图将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]; 
    } 
} 
+0

你抱怨的增加是缓慢的,或一旦与数据集中工作,这是完整的? – jrturton 2012-03-26 16:33:45

+0

此外,您正在为循环的每次迭代创建一个新的自动释放池 - 这是一个坏主意。 – jrturton 2012-03-26 16:34:46

+0

加入缓慢。花了将近2小时才将200k个物体添加到实际的iPhone 3gs上。 – Pungs 2012-03-26 17:12:05

哪些列,你有你的索引数据库?您是否尝试过在添加上下文时锁定上下文以查看它是否可以优化此操作(即,事务性插入?)

核心数据在批量插入时出了名。解决这个问题的方法可能就是直接使用sqlite - 看到这篇文章是为了一个真实生活中需要这样做的人的案例研究:http://inessential.com/2010/02/26/on_switching_away_from_core_data

+0

确实是一篇非常好的文章。我读到了太多的关于sqlite核心数据的好评。这真是让人大开眼界。 – Pungs 2012-03-26 17:32:12

+0

我没有索引(一个普通的核心数据实体,名称和消息)。我会尝试锁定上下文(尽管我不知道如何做到这一点)。 – Pungs 2012-03-26 17:34:38

+0

谢谢院长。与Sqlite相同的事情只需要几秒钟。此代码可能可以作为Core数据何时不是正确答案的示例。我仍然会尽可能地用核心数据优化这一点,然后发布一个更好的时序比较与sqlite。 – Pungs 2012-03-26 17:52:38

嘿,如果你有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; 



    } 

让我知道,如果有什么..

+0

谢谢..但很久很久以前我转换为sqllite .. – Pungs 2014-02-03 06:10:42