Эффективное и быстрое использование памяти iPhone / Android для хранения словаря / доступа - PullRequest
0 голосов
/ 12 сентября 2011

У меня проблемы с памятью на iPhone старшего поколения (ipod touch 1st gen, 2nd gen и т. Д.).Это связано с объемом памяти, выделяемой при загрузке и хранении словаря слов из 170 тыс. Слов.

Это код (очень простой):

string[] words = dictionaryRef.text.Split("\n"[0]);
_words = new List<string>(words);

Он выделяется при запуске около 12 Мбайтпамять, у iphone около 43мб я думаю.Так что + текстуры + звуки + операционная система, к которой она имеет тенденцию ломаться.

По скорости, доступ с помощью бинарного поиска - это нормально.Но его хранение в памяти более эффективно (и загрузка более эффективно).

Text.Split, кажется, занимает много памяти в куче.

Любой совет?

Ответы [ 4 ]

0 голосов
/ 13 сентября 2011

Я бы согласился с Morningstar, что использование SQLite-сервера для хранения слов звучит как лучшее решение того, что вы пытаетесь сделать.

Однако, если вы настаиваете на использовании списка слов, вотпредложение:

Мне кажется, словарь dictionaryRef.text создается путем чтения текстового файла полностью (File.ReadAllText () или чего-то подобного).

Вместо этого зачемне использовать TextReader.ReadLine () для чтения по одному слову за раз из файла в список, что исключает необходимость использования String.Split () и использования тонны временного пространства для хранения?

В конечном итоге это кажетсяв любом случае будь тем, что ты хочешь ... и ReadLine () "разделится" на \ n для тебя.

0 голосов
/ 12 сентября 2011

Используйте SQLite. Это будет использовать меньше памяти и будет быстрее. Создайте индекс для вашего столбца слов и вуаля, у вас есть бинарный поиск без загрузки всего словаря в память.

0 голосов
/ 12 сентября 2011

Во-первых, если dictionaryRef.text является строкой (и это выглядит так), то вы уже получили нечто огромное (2 байта на символы).Проверьте это, он вполне может составлять большой (почти половина) общего объема выделяемой памяти.Вам следует подумать о кешировании этого (идея с базой данных хорошая, но файл можно использовать для последующего использования File.ReadAllLines в будущем исполнении).

Далее вы можете попробовать сделать немного лучше, чем метод Split в Mono.Он создает список, а затем в конце превращает его в массив (вызывающий ToList), из которого в итоге вы создаете новый список.Поскольку ваше требование (только '/ n') довольно простое, я предлагаю вам свернуть свой собственный метод Split (или скопировать / вставить / уменьшить тот из Mono) и избегать временных выделений памяти.

В любом случаепроводить много измерений (памяти), так как выделения, даже больше для строк, часто происходят там, где мы не смотрим; -)

0 голосов
/ 12 сентября 2011

Вы не можете рассчитывать на то, сколько памяти у этих устройств до 3.0 доступно при запуске.43 МБ довольно оптимистично.Ваше приложение просто проверяет, есть ли слово в списке или нет?Возможно, вы захотите свернуть свою собственную хеш-таблицу вместо использования бинарного поиска.Я искал бы некоторую литературу и переполнение стека, чтобы найти эффективные способы хранения большого словаря с конкретными размерами слов, которые у вас есть.Поиск в Google по хеш-таблице может дать вам лучшую реализацию.

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