Я недавно играл с кодом для приложения для iPhone для анализа XML. Придерживаясь Какао, я решил пойти с классом NSXMLParser. Приложение будет отвечать за анализ 10 000+ «компьютеров», которые содержат 6 других строк информации. Для моего теста я убедился, что размер XML составляет около 900 КБ-1 МБ.
Моя модель данных - хранить каждый компьютер в NSDictionary, хэшированном уникальным идентификатором. Каждый компьютер также представлен NSDictionary с информацией. В итоге я получаю NSDictionary, содержащий 10 тыс. Других NSDictionaries.
Проблема, с которой я сталкиваюсь, не связана с утечкой памяти или эффективным хранением структуры данных. Когда мой синтаксический анализатор закончил, общее количество выделенных объектов только увеличивается примерно на 1 МБ. Проблема в том, что во время работы NSXMLParser мое выделение объектов увеличивается на целых 13 МБ. Я мог понять 2 (один для объекта, который я создаю, а другой для необработанных NSData) плюс немного места для работы, но 13 кажется немного высоким. Я не могу представить, что NSXMLParser настолько неэффективен. Мысли? * * 1005
Код ...
Код для начала разбора ...
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];
}
}
Все инициализировано и выпущено правильно. Опять же, я не получаю ошибки или утечки. Просто неэффективно.
Спасибо за любые мысли!