Оптимальный способ сохранения графа объекта на iPhone

У меня есть объектный граф в Objective-C на платформе iPhone, который я хочу сохранить при закрытии приложения. График содержит около 100–200 тыс. Объектов и содержит много циклов (по замыслу). Мне нужно иметь возможность читать / писать этот график как можно быстрее.

До сих пор я пытался использовать NSCoder. Это не только борется с циклами, но также требует времени и значительного объема памяти для сохранения графика - возможно, потому что документ XML используется под прикрытием. Я также использовал базу данных SQLite, но для прохождения этого количества строк также требуется значительное количество времени.

Я рассматривал возможность использования Core-Data, но боюсь, что у меня будут те же проблемы, что и у SQLite или NSCoder, так как я считаю, что резервное копирование основных данных будет работать таким же образом.

Так есть ли какой-нибудь другой способ облегчить обработку этого графа объектов в упрощенном виде - в идеале я хотел бы что-то вроде сериализации Java? Я думал о том, чтобы попробовать Tokyo Cabinet или записать память, занятую кучкой структур C, на диск - но это будет много работы по переписыванию.

2 ответа

Решение

Я бы порекомендовал переписать как c структуры. Я знаю, что это будет боль, но она не только быстро записывает на диск, но и должна работать намного лучше.

Прежде чем кто-то расстроится, я не говорю, что люди должны всегда использовать структуры, но в некоторых ситуациях это лучше для производительности. Особенно, если вы предварительно выделяете свою память, скажем, по 20 тыс. Смежных блоков за раз (с указателями на блок), а не создаете / выделяете много маленьких кусочков в повторяющемся цикле.

то есть, если ваш цикл постоянно выделяет объекты, это замедлит его. Если вы предварительно распределили 1000 структур и просто имеете массив указателей (или один указатель), то это на большую величину быстрее.

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

Вместо того, чтобы кататься самостоятельно, я настоятельно рекомендую еще раз взглянуть на Core Data. Базовые данные были разработаны с нуля для сохранения графов объектов. Архив на основе NSCoder, как и тот, который вы описываете, требует, чтобы у вас был весь граф объектов в памяти, и все записи были атомарными. Базовые данные доставляют объекты в память и из нее по мере необходимости и могут записывать только часть вашего графика, которая была изменена на диск (через SQLite).

Если вы прочтете Руководство по программированию основных данных или их учебное руководство, вы увидите, что они много думают об оптимизации производительности. Если вы будете следовать рекомендациям Apple (которые могут показаться нелогичными, как, например, их предложение денормализовать ваши структуры данных в некоторых моментах), вы сможете значительно повысить производительность своей модели данных, чем ожидаете. Я видел тесты, в которых Core Data легко превосходил вручную настроенный SQLite для доступа к данным в базах данных того размера, на который вы смотрите.

На iPhone у вас также есть некоторые преимущества памяти при использовании управления размером пакета выборок и очень хорошим вспомогательным классом в NSFetchedResultsController.

Это не должно занять так много времени, чтобы создать основную реализацию вашего графика Core Data, чтобы сравнить его с вашими существующими методами хранения данных.

Другие вопросы по тегам