Списки свойств Objective C или текстовые файлы?

Мне нужно импортировать список примерно из 40 000 слов в мое приложение для iPhone. Список будет одинаковым при каждом запуске приложения. Кажется, что списки свойств и текстовые файлы являются разумными вариантами.

Есть ли причина предпочесть одно другому? По непонятным мне причинам Finder говорит, что список свойств на моем Mac составляет 1 МБ, а текстовый файл - всего 328 КБ. Список свойств представляет собой NSMutableArray NSMutableArrays NSStrings. Текстовый файл представляет собой обычный текстовый файл. Но время запуска приложения также важно. Если бы я читал текстовый файл, моему приложению пришлось бы выполнять простую обработку при каждом запуске.

Спасибо.


person William Jockusch    schedule 21.01.2010    source источник


Ответы (3)


Каждый массив окружен <array></array>, а каждая строка окружена <string></string> в списках свойств XML. Я не знаю, что такое «простой текстовый файл» в контексте хранения массива, но я полагаю, что вы говорите о чем-то менее подробном, чем XML. При таком объеме данных я мог видеть, что XML занимает в три раза больше места, чем, скажем, CSV. Можно также пойти на меньший формат, если он также выполняет свою работу.

person Chuck    schedule 21.01.2010

Что сказал Джастин: сначала измерьте, а затем оптимизируйте, если самое простое решение — списки свойств — слишком дорого. Обратите внимание, что списки свойств могут быть двоичными; см. справочную страницу plutil.

Списки свойств — это не волшебство; они также должны быть проанализированы и обработаны при запуске.

Таким образом, лучше всего засунуть их все в текстовый файл, по одному слову в строке.

Теперь, если вы хотите быть суперэффективным в этом, я бы сделал что-то вроде:

  • используйте символы NULL в качестве разделителя

  • выделите буфер памяти размером с текстовый файл и прочитайте в него все содержимое файла (вы можете легко использовать +dataWithContentsOfFile: NSMutableData, а затем просто вызвать -bytes, чтобы получить доступный для записи буфер).

  • вам, очевидно, понадобится указатель на каждое слово; тривиально -- итерация через буфер символ за символом, и каждый раз, когда вы видите NULL (и не в конце), вы знаете, что следующий байт -- следующий адрес -- будет указателем на первый символ следующее слово

  • если вам нужны NSString, используйте NSString [initWithBytesNoCopy:length:encoding:freeWhenDone:][2]

Достаточно просто, чтобы я даже не считал это преждевременной оптимизацией.

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

person bbum    schedule 21.01.2010

Попробуйте оба и посмотрите, является ли скорость проблемой. Вполне возможно, что вы не заметите разницы, и в этом случае я бы использовал XML, чтобы избежать «простой обработки», которую вам пришлось бы выполнять с текстовым файлом.

person echo    schedule 21.01.2010
comment
Скорость может не быть проблемой, но память может быть проблемой. - person bbum; 21.01.2010
comment
проблема с 1мб памяти на айфоне? Я сомневаюсь в этом. - person echo; 21.01.2010
comment
На первых iPhone и iPod Touch 1 МБ был значительным объемом памяти, доступной вашему приложению. - person bbum; 21.01.2010
comment
ну, если 1 Мб значителен, значит и 1/3 Мб. - person echo; 21.01.2010