2010-09-29 89 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