Преимущества использования памяти CoreData по сравнению с оперативной памятью не очевидны / очевидны - мнения? - PullRequest
1 голос
/ 19 августа 2010

У меня есть приложение, которое в настоящее время хранит все состояния в памяти.Он извлекает кучу информации с сервера в виде JSON и затем сохраняет значения JSON в памяти.Каждый JSONObject может быть ~ 300 байт, и таких объектов может быть тысячи.Я использую эти данные просто для заполнения UITableView.

Чтобы лучше обрабатывать большие объемы данных, я изменил свой код, чтобы получать данные с сервера и сохранять их с помощью CoreData.Там объекты JSON могут быть представлены в виде простых объектов, каждый из которых имеет атрибуты 3 NSString и один атрибут int32.Я создал NSFetchedResultsController для использования в качестве источника данных UITableView.Я предполагал, что это уменьшит использование резидентной памяти моим приложением (я предполагаю, что NSFetchedResults контроллеры эффективно управляют памятью, чтобы не хранить объекты, которые не отображаются в представлении, по сравнению с хранением всего моего состояния в памяти).Для целей этого обсуждения давайте предположим, что мое приложение очищает хранилище CoreData и повторно выбирает все данные при каждом запуске.

Когда я начал измерять изменения в резидентной памяти и виртуальном размере с помощью VM Tracker вПриборы я заметил, что оба эти значения остаются практически идентичными.Infact, версия моего приложения на основе Core-Data, кажется, использует больше памяти, чем когда у меня все полностью в памяти.

Хотя это может быть правдой, у меня нет интуиции, почему это может бытьтак.Есть объяснения?Из того, что я сказал о своем приложении, похоже, что я не хочу беспокоиться о сохранении в CoreData и почему?

1 Ответ

4 голосов
/ 19 августа 2010

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

Еще одна вещь, которую стоит рассмотреть, позволяете ли вы Core Data ошибаться в этих объектах? Если вы набираете 1000 объектов и отображаете 10 из них, то остальные 990 должны быть в неисправном состоянии и, следовательно, занимать меньше памяти.

Я бы пробежался по инструментам Core Data и убедился, что у вас нет полной реализации всех этих объектов случайно и непреднамеренно приводит к тому, что использование вашей памяти оказывается выше необходимого.

Обновление

Звучит так, как будто вы импортируете эти данные, а затем не очищаете базовые данные должным образом, если вы не видите никаких сбоев.

Предполагая, что вы загружаете эти данные при первом запуске (кстати, я бы этого не делал, я бы предварительно загрузил приложение и полностью избегал plist-файлов), вы хотите вызвать -reset на вашем NSManagedObjectContext после загрузки. завершено, так что любые объекты, которые не используются, стираются из памяти. Затем, когда данные возвращаются в память (при использовании), они будут неправильно обработаны.

Наконец, убедитесь, что вы используете хранилище SQLite. В противном случае это все спорно.

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