2012-03-26 82 views
4

我試圖將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

回答

1

哪些列,你有你的索引數據庫?您是否嘗試過在添加上下文時鎖定上下文以查看它是否可以優化此操作(即,事務性插入?)

核心數據在批量插入時出了名。解決這個問題的方法可能就是直接使用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

3

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