2010-02-15 1 views
0

Я использую NSKeyedArchiver для кодирования большого объекта-графа (76295 объектов.) Требуется много времени, но еще хуже, что NSKeyedArchiver не возвращает всю свою память.Кодирование большого объекта с использованием NSKeyedArchiver Eats Memory

После использования проверки на утечку код вообще не протекает, но по какой-то причине кодировка не возвращает всю память после ее завершения.

Вызов метода кодирования несколько раз делает его еще хуже, все больше и больше памяти съедается.

У вас есть предложения, которые я мог бы пожелать?

P.S. База данных (sqlite) или CoreData не являются альтернативами, потому что они, по-видимому, очень плохо масштабируются с большим графическим объектом, подобным указанному выше.

Я предпочел бы решение с использованием NSKeyedArchiver

+0

Пока не ясно, что вы имеете в виду, когда вы говорите, масштаб SQLite/Core Data плохо с большим графом объектов. Это не большинство отчетов по этому вопросу ... –

+0

Я повторно выполнил полную часть магазина, поэтому он хранит все данные в sqlite3. Для хранения данных требуется почти 3 (!!) минуты. Я что-то пропустил, кажется очень плохой альтернативой использованию NSCoder (с ключом архиватора) Любые предложения, как сделать это быстрее? Хранение 111000 строк слишком медленно при использовании sqlite. –

ответ

0

Кажется, память возвращается к системе медленно с последующим интервалом. Так что никакой реальной утечки памяти нет.

Для кого-либо еще: попробуйте взглянуть на CoreData или sqlite3 напрямую. Если вы используете sqlite3 напрямую, убедитесь, что вы инкапсулируете полный набор запросов в транзакции; это значительно увеличит пропускную способность данных.

Подробнее о оптимизации скорости SQLite: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

1

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

Проблема с использованием NSKeyedArchiver для архивирования большого сложного графа заключается в том, что весь график складывается в память сразу. Одна утечка в одном кодере классов может взорваться, если много экземпляров этого класса заархивированы. Если у вас есть 76 000+ объектов и всего пару тысяч утечек по несколько байтов каждый, это будет складываться в спешке.

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

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

+0

Я провел некоторое тестирование, напрямую используя sqlite для хранения объектов 111000 занимает до 3 минут. Путь слишком медленный; добавив дополнительный слой поверх этого (CoreData) будет только замедлять его еще больше, к сожалению. –

+0

Как часто вы создаете и храните 111 000 новых объектов? Вы можете сделать это один раз, когда запускает первый раз, но большую часть времени вы просто читаете из хранилища этих объектов. Core Data не нужно загружать во все 111 000 объектов, только те, которые вам нужны. Кроме того, он не должен иметь все объекты в памяти, чтобы сохранить их. Основные данные быстрые. Я заменил простые комбинации словарей и массивов с помощью Core Data и увидел очевидное увеличение скорости, когда я этого не ожидал. На самом деле я не могу придумать случай в своем опыте, в котором Core Data хуже на большом графике. – TechZen

+0

Печально все время. Никаких реальных обновлений не заканчивается новыми наборами. –