2010-09-29 91 views
0

我正在創建一個基本上讀取XML文檔並基於xml創建的對象創建tableview的iphone/ipad應用程序。 xml表示文件系統中的「級別」。它基本上是瀏覽器。核心數據 - 獲取/創建NSManagedObject性能

每次我解析xml文檔時,我都會更新在覈心數據sqllite數據庫中鏡像的文件系統。對於在XML中遇到的每個「文件」,我嘗試獲取與它關聯的NSManagedObject。

問題是我用來獲取/創建一個新的空白實體或從數據庫獲取現有的一個函數。

+(File*)getOrCreateFile:(NSString*)remotePath 
     context:(NSManagedObjectContext*)context 
{ 
     struct timeval start,end,res; 
     gettimeofday(&start,NULL); 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:context]; 
     [fetchRequest setEntity:entity]; 
     [fetchRequest setFetchLimit:1]; 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"remotePath == %@",remotePath]; 
     [fetchRequest setPredicate:predicate]; 

     NSError *error; 
     NSArray *items = [context executeFetchRequest:fetchRequest error:&error]; 
     [fetchRequest release]; 

     File *f; 
     if ([items count] == 0) 
      f = (File*)[NSEntityDescription insertNewObjectForEntityForName:@"File" inManagedObjectContext:context]; 
     else 
      f = (File*)[items objectAtIndex:0]; 

     gettimeofday(&end, NULL); 
     [JFS timeval_subtract:&res x:&end y:&start]; 
     count++; 
     elapsed += res.tv_usec; 
     return f; 

}

對於eksample,如果我解析文檔與200ish文件上的iPhone 3G的總時間約爲4秒。其中3秒鐘花費在這個函數中,從核心數據中獲取物體。

RemotePath是一個可變長度的唯一字符串,並在sqllite數據庫中建立索引。

我在這裏做錯了什麼?或..我可以做得更好/不同以提高表現。

回答

0

核心數據執行提取有點貴,雖然核心數據工程師已經做了一些驚人的工作,以保持最小的命中。因此,您可以通過運行一次提取來一次返回多個項目,從而稍微改進一些問題。例如,批處理remotePaths並使用謂詞獲取,如

[NSPredicate predicateWithFormat:@"remotePath IN %@", paths]; 

其中paths是可能路徑的集合。

從結果中,您可以在內存中執行搜索以確定是否存在特定路徑。

然而,基本上,對字符串進行提取(即使索引)是一個昂貴的操作。可能沒有太多你可以做的事情。考慮針對非字符串屬性進行讀取,也許可以通過保存路徑並將哈希保存在實體中。您將返回一個(可能)較大的結果集,然後您可以在內存中搜索字符串相等性。

最後,不要讓任何更改沒有一些性能數據。簡介,簡介,簡介。

+1

在數據模型中,每個文件夾與每個子文件夾(文件夾/文件)都有一對多的關係。我最終使用[NSFetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@「children」],並且這將每個孩子都作爲錯誤返回,然後每次都不用調用其他函數,而是使用NSPredicate在內存集合中搜索現在的孩子。原帖的4秒現在是1.5ish。 – 2010-10-01 08:32:07