Objective c 大型核心数据对象

Objective c 大型核心数据对象,objective-c,ios,core-data,dataset,nsmanagedobject,Objective C,Ios,Core Data,Dataset,Nsmanagedobject,我试图将200000条消息添加到一个核心数据对象中,以验证twitter应用程序的概念。这很好地工作,并且添加了我的实体。我有一个UISearchBar和一个UITableView来显示这些。然而,对于每一个新的1000个对象,我的时间似乎呈指数增长。这正常吗?我期望CoreData在处理大型数据集时表现良好。对于处理如此庞大的数据集,您是否有更好的建议。我想知道字典应用程序是如何工作的 我的控制台输出如下: -2012-03-26 22:19:28.126推特阅读器[3668:707]完成10

我试图将200000条消息添加到一个核心数据对象中,以验证twitter应用程序的概念。这很好地工作,并且添加了我的实体。我有一个
UISearchBar
和一个
UITableView
来显示这些。然而,对于每一个新的1000个对象,我的时间似乎呈指数增长。这正常吗?我期望
CoreData
在处理大型数据集时表现良好。对于处理如此庞大的数据集,您是否有更好的建议。我想知道
字典应用程序是如何工作的

我的控制台输出如下:

-2012-03-26 22:19:28.126推特阅读器[3668:707]完成1000次
-2012-03-26 22:19:40.335推特阅读器[3668:707]完成2000年
-2012-03-26 22:19:55.136推特阅读器[3668:707]完成3000次
-2012-03-26 22:20:18.569推特阅读器[3668:707]完成4000次
-2012-03-26 22:20:50.166推特阅读器[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推特阅读器[3668:707]完成8000次
-2012-03-26 22:24:21.321推特阅读器[3668:707]完成9000次
-2012-03-26 22:25:35.017推特阅读器[3668:707]完成10000次
-2012-03-26 22:26:57.250推特阅读器[3668:707]完成11000
-2012-03-26 22:28:27.563推特阅读器[3668:707]完成12000次
-2012-03-26 22:30:06.202推特阅读器[3668:707]完成13000
-2012-03-26 22:31:52.645推特阅读器[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];
    }
}

for(NSInteger i=1;i您在数据库中为哪些列编制了索引?您是否尝试在添加时锁定上下文,以查看它是否可以优化这一点(即,以事务方式进行插入?)


核心数据在批量插入方面是出了名的糟糕。解决这个问题的方法可能只是直接使用sqlite——请参阅本文,了解必须这样做的人的真实案例研究:

嘿,如果你有200000条消息,首先要找出每条消息长度的最佳存储方式。这将是反复试验,我发现3000条是optimum.每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;



    }

用于(i=0;你是在抱怨添加速度太慢,还是在完成后处理数据集?此外,你正在为循环的每次迭代创建一个新的自动释放池——这是个坏主意。添加速度太慢。在实际的iPhone 3gs上添加20万个对象几乎需要2个小时。添加之后,UISearchBar和fetching w虽然不如我见过的字典应用程序好,但还是比较合理。谢谢你指向autorelease池,我会改变它,看看是否有任何时间上的改进。确实是一篇非常好的文章。我在各地都读到了很多关于sqlite核心数据的赞扬。这让我大开眼界。我没有索引(带名称和消息的纯核心数据实体)。我将尝试锁定上下文(尽管我不确定如何锁定)。谢谢dean。使用Sqlite做同样的事情只需要几秒钟。这段代码可能可以作为核心数据不是正确答案的示例。我仍然会尽可能尝试使用核心数据对此进行优化,然后与Sqlite进行更好的时间比较。