我最近在编写一个iPhone应用程序的代码,用于解析XML。为了保持与Cocoa框架的一致性,我选择使用NSXMLParser类。这个应用程序将负责解析10,000多台“计算机”,每台计算机都包含6个字符串类型的信息。为了测试,我验证了XML文件大小约为900k-1MB。
我的数据模型是将每台计算机存储在NSDictionary中,以唯一标识符进行哈希。每台计算机也由一个NSDictionary表示其信息。因此,在一天结束时,我得到了一个包含10k个其他NSDictionary的NSDictionary。
我遇到的问题不是内存泄漏或有效的数据结构存储问题。当我的解析器完成后,总分配对象的数量仅会增加约1MB。问题在于当NSXMLParser运行时,我的对象分配会跳跃性地增加高达13MB。我可以理解有2个(一个是我正在创建的对象,另一个是原始NSData),再加上一些工作空间,但13MB似乎有点太高了。我无法想象NSXMLParser是如此低效的。你有什么想法?
代码...
开始解析的代码...
我的数据模型是将每台计算机存储在NSDictionary中,以唯一标识符进行哈希。每台计算机也由一个NSDictionary表示其信息。因此,在一天结束时,我得到了一个包含10k个其他NSDictionary的NSDictionary。
我遇到的问题不是内存泄漏或有效的数据结构存储问题。当我的解析器完成后,总分配对象的数量仅会增加约1MB。问题在于当NSXMLParser运行时,我的对象分配会跳跃性地增加高达13MB。我可以理解有2个(一个是我正在创建的对象,另一个是原始NSData),再加上一些工作空间,但13MB似乎有点太高了。我无法想象NSXMLParser是如此低效的。你有什么想法?
代码...
开始解析的代码...
NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
[parser setDelegate:dictParser];
[parser parse];
output = [[dictParser returnDictionary] retain];
[parser release];
[dictParser release];
解析器的委托代码...
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if(mutableString)
{
[mutableString release];
mutableString = nil;
}
mutableString = [[NSMutableString alloc] init];
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(self.mutableString)
{
[self.mutableString appendString:string];
}
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"size"]){
//The initial key, tells me how many computers
returnDictionary = [[NSMutableDictionary alloc] initWithCapacity:[mutableString intValue]];
}
if([elementName isEqualToString:hashBy]){
//The unique identifier
if(mutableDictionary){
[mutableDictionary release];
mutableDictionary = nil;
}
mutableDictionary = [[NSMutableDictionary alloc] initWithCapacity:6];
[returnDictionary setObject:[NSDictionary dictionaryWithDictionary:mutableDictionary] forKey:[NSMutableString stringWithString:mutableString]];
}
if([fields containsObject:elementName]){
//Any of the elements from a single computer that I am looking for
[mutableDictionary setObject:mutableString forKey:elementName];
}
}
所有初始化和释放都正确。再次强调,我没有收到错误或泄漏的提示。只是效率低下。
感谢您的任何想法!