Recientemente he estado jugando con el código de una aplicación de iPhone para analizar XML. Siguiendo con Cocoa, decidí ir con la clase NSXMLParser. La aplicación será responsable de analizar más de 10,000 "computadoras", todas las cuales contienen otras 6 cadenas de información. Para mi prueba, he verificado que el XML tiene un tamaño aproximado de 900k-1MB.NSXMLParser Eficiencia de asignación de memoria para el iPhone
Mi modelo de datos es para mantener cada computadora en un hash NSDictionary con un identificador único. Cada computadora también está representada por un NSDiccionario con la información. Entonces, al final del día, termino con un NSDictionary que contiene 10k otros NSDictionaries.
El problema con el que me estoy encontrando no es sobre la fuga de memoria o el almacenamiento eficiente de la estructura de datos. Cuando mi analizador está listo, la cantidad total de objetos asignados solo aumenta en aproximadamente 1 MB. El problema es que mientras NSXMLParser se está ejecutando, mi asignación de objetos está aumentando tanto como 13 MB. Pude entender 2 (uno para el objeto que estoy creando y otro para NSData en bruto) más un pequeño espacio para trabajar, pero 13 parece un poco alto. No puedo imaginar que NSXMLParser sea tan ineficiente. ¿Pensamientos?
Código ...
El código para iniciar el análisis ...
NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
[parser setDelegate:dictParser];
[parser parse];
output = [[dictParser returnDictionary] retain];
[parser release];
[dictParser release];
Y el código delegado del analizador ...
-(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];
}
}
Todo inicializado correctamente y puesto en libertad. De nuevo, no estoy recibiendo errores o goteando. Simplemente ineficiente.
Gracias por cualquier idea!
muestra parte de su xml – vaddieg