Question

Je fais des tests, et un de mes besoins est de lire les données de différents fichiers xml et empiler ensemble sur un seul fichier. Alors que je suis parvenu à cette fin, la consommation de mémoire semble être assez grande pour la tâche, le simulateur d'iPhone n'a même pas lever l'avertissement de mémoire, mais je ne pense pas que le vrai iPhone tolérerait cela (je n'ai pas un dispositif pour l'essayer ici, donc je spécule que la plupart de ce que j'ai lu).
La (partie principale de la) est le code comme:

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

En utilisant la commande « Construire et Analyser » me donne pas de fuite ou quoi que ce soit, et le code ne soulève pas d'avertissement lors de la construction, mais encore, la consommation de mémoire se situe entre 50 et 70Mo (juste considérant octets en direct, dans l'ensemble il double presque ).
L'idée est évidemment de ne pas lire 100 fois le même fichier, mais que les données de test plus que suffit, puisque le code doit de lire le contenu des fichiers xml et les envoyer à un fichier dans l'ordre où ils sont reçus.

Y at-il moyen de forcer la libération de certains objets temporaires avant de nouvelles sont attribuées, je pourrais essayer de réutiliser certaines variables, toutes les idées qui me garder cette sous contrôle sont vraiment les bienvenus.

Modifier - juste pour rendre les choses un peu plus intéressant: il serait préférable de garder un seul analyseur à lire et à écrire, et en ce que le mieux serait de rester avec GDataXML ou, si un changement était nécessaire, d'utiliser KissXML, TinyXML ou libxml - DOM, qui tous semblent aspirer un peu plus de mémoire, comme l'a dit ici , donc s'il y avait un moyen de faire respecter la libération de la mémoire, il serait le meilleur.

Merci à l'avance:)

Était-ce utile?

La solution

En fait, ce fut une résolution assez simple.

Tout ce que je devais faire était d'instancier un AutoReleasePool et le drain à la fin de la boucle.
Comme ceci:

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

Cette contrainte de publier des objets marqués comme autorelease instancié à l'intérieur du car, qui viennent d'être libéré après sa fin, comme il était prévu, sans interférer dans tout le reste, donc pas d'objets ont été libérés avant qu'ils ne le devraient.
La consommation de mémoire a chuté de 60 ~ 80MB huée à quelque chose comme 1,6MB pendant la boucle, et retourner à la même 600kb après (il était une application factice qui fait juste cela).

Je vais laisser encore cette question ouverte pendant un certain temps, au cas où quelqu'un a une meilleure idée, mais pour l'instant, semble que ce sera la façon suivante:)

Autres conseils

Oui, tu as « doublé » en lisant tout en un NSData, puis l'analyse syntaxique dans un DOM en GDataXMLDocument. Si vous prévoyez de passer par beaucoup de données XML comme celui-ci, en boucle sur plusieurs fichiers, etc., alors vous devriez envisager SAX base au lieu l'analyse syntaxique, et le streaming directement à partir du fichier plutôt que de préchargement dans un NSData. De cette façon, vous ne devrez pas « libérer des objets temporaires » parce que vous ne serez extrayez les informations dont vous avez besoin, comme il est analysé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top