Domanda

Ho fatto alcuni test, e uno dei miei bisogni è quello di leggere i dati provenienti da diversi file XML e stack insieme su un singolo file. Mentre sono riuscito a raggiungere questo obiettivo, il consumo di memoria sembra essere abbastanza grande per il compito, il simulatore di iPhone non ha nemmeno alzare l'avvertimento di memoria, ma non credo che il vero iPhone avrebbe tollerato questo (non ho un dispositivo per provare qui, quindi sto per lo più ipotizzando che da quello che ho letto).
La (parte principale della) codice è del tipo:

Boolean success = [fileManager createFileAtPath:documentsPath contents:nil attributes:nil];
[fileManager release];

if (success) {
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:documentsPath];
    for (int i = 0; i < 100; i++) {

        NSString *path = [[NSBundle mainBundle] pathForResource:@"mensagem_de_arquivo" 
                                                         ofType:@"xml"];
        NSData *data = [NSData dataWithContentsOfFile:path];
        GDataXMLDocument *xml = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
        NSArray *tokens = [xml nodesForXPath:@"//message/data" error:nil];
        if (tokens.count > 0) {
            GDataXMLElement *token = (GDataXMLElement *)[tokens objectAtIndex:0];
            [fileHandle writeData:[[token stringValue] dataUsingEncoding:NSASCIIStringEncoding]];
        }
        [xml release];
    }

Utilizzando il "Build and Analyze" comando mi dà nessuna perdita o niente, e il codice non genera avvisi quando si costruisce, ma ancora, il consumo di memoria va da qualche parte tra 50 e 70 MB (solo considerando byte dal vivo, nel complesso è quasi doppie ).
L'idea, ovviamente, è di non leggere 100 volte lo stesso file, ma come dati di prova più che sufficiente un, dal momento che il codice deve leggere solo il contenuto da file XML e inviarli a un file nell'ordine in cui vengono ricevuti.

C'è un modo per forzare il rilascio di alcuni oggetti temporanei prima di quelli nuovi sono assegnati, potrei cercare di riutilizzare alcune variabili, tutte le idee che mi aiutano a mantenere questo sotto controllo sono davvero i benvenuti.

Modifica - solo per rendere le cose un po 'più interessante: sarebbe meglio per mantenere un singolo parser per leggere e scrivere, e che la cosa migliore sarebbe quella di attaccare con GDataXML o, se era necessario un cambiamento, per usare KissXML, TinyXML o libxml - DOM, che tutti sembrano aspirare un po 'più di memoria, come ha detto qui , quindi, se ci fosse un modo per far rispettare il rilascio della memoria che sarebbe stato il migliore.

Grazie in anticipo:)

È stato utile?

Soluzione

In realtà, si trattava di una molto semplice risoluzione.

Tutto quello che dovevo fare era creare un'istanza di un AutoReleasePool e scarico alla fine del ciclo.
In questo modo:

for (int i = 0; i < 100; i++) {
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
    //... do everything I've done before...
    [pool drain];
}

Questa costretto a rilascio oggetti contrassegnata come autorelease istanziato all'interno per, che sono stati solo di essere rilasciato dopo che è fine, come ci si aspettava, senza interferire in tutto il resto, quindi nessun oggetto sono stati rilasciati prima di quanto dovrebbero.
Il consumo di memoria è sceso da una convulsa 60 ~ 80MB a qualcosa come 1,6mb durante il ciclo, e andando indietro allo stesso 600kb dopo che è (era un'applicazione fittizio che fare proprio questo).

Io sarò ancora lasciare questa domanda per un po 'aperta, nel caso qualcuno ha un'idea migliore, ma per ora, sembra che questo sarà il modo:)

Altri suggerimenti

Si, hai "raddoppiata" leggendo il tutto in un NSData, poi l'analisi in un DOM in GDataXMLDocument. Se vi aspettate di passare attraverso un sacco di dati XML come questo, il ciclo su più file, ecc, allora si dovrebbe considerare basato SAX parsing invece , e lo streaming direttamente dal file piuttosto che il precaricamento in un NSData. In questo modo, non sarà necessario "liberare oggetti temporanei" perché sarete estraendo solo le informazioni necessarie, come è analizzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top