Frage

Ich habe einige Tests getan, und einer meiner Bedürfnisse ist, Daten aus verschiedenen XML-Dateien zu lesen und es stapeln zusammen auf einer einzigen Datei. Während ich habe es geschafft, dies zu erreichen, den Speicherverbrauch recht groß für die Aufgabe zu sein scheint, hat der iPhone-Simulator nicht einmal die Erinnerung Warnung erhöhen, aber ich glaube nicht, das reale iPhone tolerieren würde (ich habe nicht ein Gerät, um es hier zu versuchen, so dass ich meistens bin spekulieren, dass von dem, was ich gelesen habe).
Der (Hauptteil des) -Code ist wie:

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

Mit dem „Build and Analyze“ Befehl gibt mir kein Leck oder irgendetwas, und der Code nicht Warnungen hebt beim Bau, aber immer noch, geht der Speicherverbrauch irgendwo zwischen 50 und 70 MB (nur Live-Bytes bedenkt, ist es insgesamt fast verdoppelt ).
Die Idee ist natürlich nicht 100-mal die gleiche Datei zu lesen, aber als Testdaten mehr als genügt, da muss der Code nur den Inhalt von XML-Dateien lesen und sie in eine Datei in der Reihenfolge, wie sie empfangen werden, senden.

Gibt es eine Möglichkeit, die Freilassung einiger temporären Objekte zu erzwingen, bevor neue zugewiesen werden, könnte ich versuchen, einige Variablen wieder zu verwenden, wird alle Ideen, die mir helfen, diese Kontrolle unter halten sind sehr willkommen.

Bearbeiten - nur um die Dinge ein wenig interessanter: es wäre besser, einen einzigen Parser zu halten, um zu lesen und schreiben, und damit die beste sein würde, mit GDataXML zu bleiben oder, wenn eine Änderung erforderlich war, KissXML, TinyXML oder libxml zu verwenden - DOM, die alle scheinen ein wenig mehr Speicher, die als hier , so, wenn es ein Weg, um die Freigabe von Speichern zu erzwingen es das beste wäre.

Vielen Dank im Voraus:)

War es hilfreich?

Lösung

Eigentlich war es eine ganz einfache Lösung.

Alles, was ich tun musste, war ein AutoReleasePool zu instanziiert und es am Ende der Schleife ablaufen lassen.
Wie folgt aus:

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

gezwungen Dies kann zur Freisetzung Objekte als Autorelease markiert innerhalb des instanziiert für, die gerade nach dem Ende der freigegeben wurden, wie es zu erwarten war, ohne sonst in allen Dingen zu stören, so dass keine Objekte freigegeben wurden, bevor sie sollten.
Speicherverbrauch sank von einem Keuchhusten 60 ~ 80MB zu so etwas wie 1,6MB während der Schleife, und geht zurück auf die gleiche 600kb, nachdem es (es war ein Dummy-Anwendung, dass genau dies getan).

Ich werde diese Frage noch offen für eine Weile verlassen, falls jemand eine bessere Idee hat, aber jetzt scheint dies der richtige Weg sein:)

Andere Tipps

Ja, du hast „verdoppelt“, indem sie alle in ein NSData lesen, dann in einen DOM in GDataXMLDocument Parsen. Wenn Sie durch eine Menge von XML-Daten wie diese gehen erwarten, Schleifen über mehrere Dateien, usw., dann sollten Sie betrachten SAX Basis statt Parsen und Streaming direkt aus der Datei, anstatt sie in eine NSData Vorbelastung. Auf diese Weise werden Sie nicht auf „Freigabe temporäre Objekte“ haben, weil Sie nur die benötigten Informationen zu extrahieren werden, wie es analysiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top