2010-02-05 4 views
1

J'ai une application Iphone avec un grand NSArray imbriqué de chaînes. Le NSArray va à 3 niveaux de profondeur, et il y a un total d'environ 15 000 cordes aux niveaux les plus profonds. La grande majorité des chaînes ont moins de 20 caractères. De temps à autre, mon appli est suspendue pendant un moment, puis reprend son fonctionnement après 5-25 secondes. C'est évidemment inacceptable. Si je lance l'application avec seulement 2 000 des chaînes, les accroches deviennent beaucoup plus rares. Donc, je suis assez sûr que le grand NSArray est à l'origine du problème.iphone grand NSArray de chaînes performances malheurs

Quelle structure de données alternative serait susceptible de mieux fonctionner? Tout ce dont j'ai besoin est de lire rapidement le tableau à partir d'un fichier lorsque l'application démarre, puis pouvoir accéder aux chaînes de manière aléatoire à partir du tableau. [C'est en fait un peu plus compliqué que ça; Je dois être capable de saisir des chaînes aléatoires à partir de sous-ensembles prédéterminés du tableau.] Le programme peut saisir une chaîne aléatoire aussi souvent qu'une fois par seconde. Par ailleurs, NSArray est actuellement stocké dans une classe singleton.

+0

Vous devez rechercher les causes du raccrochage. Comment demandez-vous ces articles? Il n'y a aucune raison que l'indexation directe ('objectAtIndex:') trois fois provoque 20 secondes d'attente. –

+0

Une partie de mon problème est que je ne comprends pas vraiment les outils. J'ai profilé avec Shark et il a été dit que 90 +% de mon CPU était utilisé par le PID # 0. Mais je n'ai aucune idée de ce qu'est le PID # 0. –

Répondre

1

Alors que d'autres structures de données (TRIE) ne viennent à l'esprit, les vraies questions sont:

(1) Avez-vous ou pouvez-vous le profil avec des instruments au cours de ces blocages

et avec la non-necessarily- supposition correcte que les tableaux sont votre problème

(2) Quelles opérations effectuez-vous sur les baies?

Vous ne voulez pas deviner ce qui cause des problèmes de performance à moins que vous n'ayez pas le choix, vous voulez mesurer. Mais si vous m'aviez fait deviner ... Je me demande si vous avez des problèmes de mémoire, et si les blocages sont le système qui émet des avertissements de mémoire faible et des choses de nettoyage.

+0

Je sais que je ne fuis pas. Les allocations d'objets peuvent aller jusqu'à environ 10 Mo par minute. Au-delà, quelles parties des instruments pourraient me donner des informations utiles? –

+0

Time Profiler. Que fait-il quand il se bloque? – Ken

+0

Je ne sais pas parce que j'essaie comme je pourrais, je ne peux pas obtenir le profileur de temps pour profiler mon Ipod touch. Il est toujours grisé. Je l'ai fait profiler sous requin et c'était 90% + PID # 0. Mais je ne sais pas ce qu'est le PID # 0 non plus. –

2

Avec autant de chaînes, il n'y a aucun moyen de les avoir dans une table à la fois (à droite ???).

Vous avez vraiment, vraiment besoin de les mettre dans une base de données et d'y accéder à la demande. Les données de base sont personnalisées en fonction des graphiques d'objets volumineux persistants et vous permettent de retirer rapidement les parties qui vous intéressent, tout en mettant en cache les éléments cachés. Comme pour les instruments, vous voulez vraiment utiliser Time Profiler pour voir où le système passe tout son temps - de préférence sur l'appareil lui-même. Vous pourriez trouver que beaucoup de temps est passé dans des objets autoreleasing, par exemple (dont la longue pause aléatoire semblerait être un signe de) - cela correspondrait à se débarrasser constamment de grandes portions de tableaux.

+0

Je ne suis pas sûr de ce que vous entendez par "dans une table". Ils sont dans un NSArray qui est chargé en mémoire. Voulez-vous dire que cela pourrait être mon problème? –

+0

Je suis sûr que c'est votre problème, ou du moins ce n'est pas une bonne idée - par "dans une table" je veux dire en fait tout affiché à l'utilisateur à la fois dans un UITable.C'est ce qui me semble très improbable, en présentant une table à l'utilisateur avec 10k entrées pour faire défiler si. Étant donné que vous ne les montrerez pas tous en même temps, les conserver dans une base de données est plus logique. –

+0

Ceci est seulement environ 350 Ko de stockage représenté, donc cette quantité de mémoire en soi ne semble pas fou. Je pense que cela dépend de ce que vous faites avec. – Ken