Recentemente ho giocato con il codice per un'app per iPhone per analizzare XML. Attaccando a Cocoa, ho deciso di andare con la classe NSXMLParser. L'app sarà responsabile per l'analisi di oltre 10.000 "computer", tutti contenenti 6 altre stringhe di informazioni. Per il mio test, ho verificato che l'XML ha una dimensione di 900k-1MB.NSXMLParser Memory Allocation Efficienza per l'iPhone
Il mio modello di dati è quello di mantenere ogni computer in un NSDictionary hash da un identificatore univoco. Ogni computer è anche rappresentato da un NSDictionary con le informazioni. Così alla fine della giornata, finisco con un NSDictionary contenente 10k altri NSDictionaries.
Il problema che sto incontrando non riguarda la perdita di memoria o l'efficiente archiviazione della struttura dati. Al termine del mio parser, la quantità totale di oggetti allocati aumenta solo di circa 1 MB. Il problema è che mentre NSXMLParser è in esecuzione, la mia allocazione di oggetti sta salendo fino a 13 MB. Potrei capire 2 (uno per l'oggetto che sto creando e uno per il raw NSData) più un po 'di spazio per lavorare, ma 13 sembra un po' alto. Non riesco a immaginare che NSXMLParser sia inefficiente. Pensieri?
Codice ...
Il codice per avviare l'analisi ...
NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
[parser setDelegate:dictParser];
[parser parse];
output = [[dictParser returnDictionary] retain];
[parser release];
[dictParser release];
E il codice delegato del parser ...
-(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];
}
}
Tutto inizializzato e rilasciato in modo corretto. Di nuovo, non ricevo errori o perdite. Semplicemente inefficiente.
Grazie per qualsiasi pensiero!
mostra parte del file xml – vaddieg