Iphone большой NSArray из строк производительности горе - PullRequest
1 голос
/ 05 февраля 2010

У меня есть приложение для Iphone с большим вложенным NSArray строк. NSArray проходит 3 уровня в глубину, и в общей сложности около 15 000 строк на самых глубоких уровнях. Подавляющее большинство строк имеют менее 20 символов. Время от времени мое приложение зависает на некоторое время, а затем возобновляет работу через 5-25 секунд или около того. Это явно недопустимо. Если я запускаю приложение только с 2000 строк, зависания становятся намного реже. Поэтому я почти уверен, что большой NSArray вызывает проблему.

Какая альтернативная структура данных будет работать лучше? Все, что мне нужно, это быстро прочитать массив из файла при запуске приложения, а затем иметь возможность произвольного доступа к строкам из массива. [Это на самом деле немного сложнее, чем это; Мне нужно иметь возможность получать случайные строки из заранее определенных подмножеств массива.] Программа может получать случайные строки так часто, как раз в секунду.

Между прочим, NSArray в настоящее время хранится в одноэлементном классе.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

С таким количеством строк вы не сможете сразу их поместить в таблицу (верно ???).

Вам действительно нужно поместить их в базу данных и получать к ним доступ по требованию. Базовые данные созданы специально для сохранения больших графов объектов и позволяют быстро извлекать части, которые вам интересны, в то время как они кешируют скрытые для вас вещи.

Что касается инструментов, вы действительно хотите использовать Time Profiler, чтобы увидеть, где система проводит все свое время - предпочтительно на самом устройстве. Например, вы можете обнаружить, что очень много времени тратится на автоматическое освобождение объектов (что, по-видимому, является признаком длинной случайной паузы), что соответствует постоянному избавлению от больших частей массивов.

1 голос
/ 05 февраля 2010

В то время как другие структуры данных (trie) приходят на ум, настоящие вопросы:

(1) Есть ли у вас или вы можете профиль с инструментами во время этих зависаний

и с не обязательно правильным предположением, что массивы - ваша проблема

(2) Какие операции вы выполняете с массивами?

Вы не хотите догадываться о том, что вызывает проблемы с производительностью, если у вас нет выбора, вы хотите измерить. Но если бы вы заставили меня догадаться ... я бы подумал, что у вас не хватает памяти, и не зависает ли система, выдает предупреждения о нехватке памяти и все исправляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...