gpt4 book ai didi

iphone - iPhone 的 NSXMLParser 内存分配效率

转载 作者:行者123 更新时间:2023-12-03 16:08:41 26 4
gpt4 key购买 nike

我最近一直在研究 iPhone 应用程序的代码来解析 XML。坚持使用 Cocoa,我决定使用 NSXMLParser 类。该应用程序将负责解析 10,000 多台“计算机”,所有这些计算机都包含 6 个其他字符串信息。对于我的测试,我已验证 XML 的大小约为 900k-1MB。

我的数据模型是将每台计算机保存在一个由唯一标识符散列的 NSDictionary 中。每台计算机也由包含信息的 NSDictionary 表示。所以最终,我得到了一个包含 10k 个其他 NSDictionary 的 NSDictionary。

我遇到的问题不是内存泄漏或有效的数据结构存储。当我的解析器完成后,分配的对象总量仅增加了大约 1MB。问题是,当 NSXMLParser 运行时,我的对象分配突然增加了 13MB。我可以理解 2(一个用于我正在创建的对象,一个用于原始 NSData)加上一点工作空间,但 13 似乎有点高。我无法想象 NSXMLParser 效率这么低。想法?

代码...

开始解析的代码...

NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
[parser setDelegate:dictParser];
[parser parse];
output = [[dictParser returnDictionary] retain];
[parser release];
[dictParser release];

以及解析器的委托(delegate)代码...

-(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];
}
}

一切都已正确初始化和释放。再说一次,我没有收到错误或泄漏。只是效率低下。

感谢您的任何想法!

最佳答案

NSXMLParser 是一个内存消耗者:

  1. 它不是真正的流解析器:initWithURL:将下载完整的处理之前先处理 xml。为了内存使用这个是不好的,因为它必须为完整的 xml 分配内存直到解析结束。对于性能来说是也不好,因为你不能交错下载的IO密集部分以及解析的 CPU 密集部分。
  2. 它不会释放内存。它似乎创建的字符串/字典在解析过程中保留直到解析结束。我试过了创造性地使用来改进它NSAutoreleasePool 但没有任何成功。

替代方案是 libxml 和 AQXMLParser这是 libxml 的 NSXMLParser 兼容包装器,或 ObjectiveXML .

参见my blog article了解更多详情。

关于iphone - iPhone 的 NSXMLParser 内存分配效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com