Как устранить нехватку памяти в WP7, используя словарь? - PullRequest
0 голосов
/ 28 марта 2011

Я создаю приложение в WP7, где мне требуется загрузить около 20000 жестко закодированных данных ({'a', "XYZ"}, {'b', "mno"}, ....), в которые мне нужновыполнить поиск.Поэтому я пытаюсь сделать это, создав словарь, обозначающий «а» как ключ и значение как «XYZ».Как только мой словарь заполняется, он выдает исключение Out of memory.Как я могу решить эту проблему, учитывая, что я собираю приложение WP7?Или есть какой-то способ, кроме использования словаря?

Ответы [ 2 ]

6 голосов
/ 28 марта 2011

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

Рекомендуемое решение: найдите способ категоризации данных, чтобы не все они загружались в телефон.Выполняйте обработку на сервере, на котором он находится (не на телефоне).

Если вы настаиваете на обработке такого количества данных на телефоне, сначала попробуйте управлять размером загрузки.Помните, что вы говорите о мобильном телефоне здесь, и не везде есть максимальные скорости 3G.Постарайтесь максимально сжать структуру данных (например, используя дерево для хранения общих префиксов).Также попробуйте заархивировать данные перед загрузкой.

Затем агрессивно посчитайте потребление памяти для каждого объекта.Ввод 20000 строк может легко потреблять много памяти.Вы хотели бы уменьшить размер использования памяти для каждого объекта, насколько это возможно.В вашем примере вы просто добавляете туда строки, поэтому я не могу догадаться, как бы вы израсходовали десятки МБ, допустимые в приложении WP7.Однако, если вы помещаете не просто строки, а большие объекты, считайте байты.

Кроме того, агрессивно управляйте фракционированием.Последнее, что вы хотите сделать, это new Dictionary() затем dict.Add(x,y); в цикле for.Когда внутреннее табличное пространство словаря заполняется, оно выделяется на новое место, а весь словарь копируется на новое место, тратя впустую исходное пространство.В итоге у вас будет много фрагментированного пространства памяти.Сделайте new Dictionary(20000) или что-то еще, чтобы зарезервировать место первым за один раз.

1 голос
/ 28 марта 2011

Вместо того, чтобы хранить его в памяти как Dictionary, вы можете сохранить его в Database ( wp7sqlite ) и извлекать только необходимые данные. Таким образом, вы можете хранить любое количество данных.

Редактировать

Ничего не требуется от пользователя end.Вы можете создать базу данных с помощью sqlite manager , присоедините ее к проекту. Скопируйте БД в изолированное хранилище при первом использовании. И вы можете обращаться к БД всякий раз, когда Вы хотите. Проверьте эту ссылку Помощник БД . Эта ссылка использует sqlitewindowsphone вместо WP7Sqlite. Я предпочитаю wp7sqlite Так как я получил ошибку при использовании sqlitewindowsphone.

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