Базовые данные выведенная миграция – автоматический “легкий вес” по сравнению с руководством

Я обновил модель существующего приложения для iPhone некоторыми простыми способами (удалите атрибут, добавьте атрибут, удалите индекс), и может использовать автоматическую легкую миграцию для миграции персистентного хранилища.

Из-за типичного размера набора данных, время обработки является весьма значительным, и гарантирует обратную связь для пользователя.

NSMigrationManager обеспечивает простое, но полезное migrationProgress значение, которое отправляет уведомления KVO как миграцию, выполняется. Это формирует основание из обеспечения обратной связи, однако пытаясь использовать выведенную модель ([NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:]) результаты в решительно другой синхронизации для того же самого набора данных.

Профиль заканчивается на исходном iPhone (2G), Размер кэша: 1,785 МБ на диске.

Автоматическая выведенная легкая миграция

PROFILE: CacheManager -migrateStore
PROFILE:   0.6130 (+0.6130) models loaded
PROFILE:   1.1759 (+0.5629) delegate -CacheManagerWillMigrate:
PROFILE:   1.2516 (+0.0757) persistent store coordinator loaded
PROFILE:   5.1436 (+3.8920) automatic lightweight migration completed
PROFILE:   5.5435 (+0.3999) delegate -CacheManagerDidFinishMigration:withError:

Руководство вывело миграцию

PROFILE: CacheManager -migrateStore
PROFILE:   0.6660 (+0.6660) models loaded
PROFILE:   1.1471 (+0.4811) inferred mapping model generated
PROFILE:   1.4046 (+0.2574) delegate -CacheManagerWillMigrate:
PROFILE:   1.5058 (+0.1013) persistent store coordinator loaded
PROFILE:   22.6952 (+21.1894) manual migration completed
PROFILE:   23.1478 (+0.4525) delegate -CacheManagerDidFinishMigration:withError:

Так, с выведенной моделью ручная миграция вступает во владение в 5 раз дольше, чем автоматический!


ОБНОВЛЕНИЕ: Образцовая загрузка

В базовой документации Данных для NSPersistentStoreCoordinator "Опции миграции" говорится:

NSInferMappingModelAutomaticallyOption

... координатор попытается вывести отображающуюся модель, если ни один не может быть найден.

И именно поэтому XCode созданная, скомпилированная и связанная отображающаяся модель должен быть удален (или просто не предназначен) позволить выведенной и легкой миграции происходить.


Это - большое несоответствие и легкая опция это NSPersistentStoreCoordinator -addPersistentStoreWithType:configuration:URL:options:error: не обеспечивает абсолютно никакого признака прогресса при обработке.

Может кто-либо обеспечивать поддерживаемый способ добраться migrationProgress значения во время автоматической миграции ИЛИ способ настроить выведенную модель отображения, чтобы быть настолько же быстрым во время руководства, обрабатывающего как автоматический?


ОБНОВЛЕНИЕ: отчет об ошибках

Говорил с инженерами в WWDC, и они попросили отчет об ошибках, запрашивающий migrationProgress для автоматической легкой обработки миграции.

Я обновлю снова, если API будет обновлен для добавления создания отчетов прогресса..

10
задан westsider 2 March 2011 в 02:01
поделиться

1 ответ

Что происходит, когда вы сами определяете модель сопоставления вместо использования предполагаемого модель? Похоже, создание предполагаемой модели снижает производительность, которую решит прямое определение модели сопоставления и ее включение в ваш проект.

update

Я уже пробовал эту стратегию, и использование модели отображения, созданной в XCode, дает примерно такое же время обработки, что и модель, предполагаемая во время выполнения. Единственная реальная разница заключается в том, что время загрузки модели из пакета немного быстрее, чем время, предполагаемое во время выполнения. Кроме того, как только модель сопоставления включена в приложение, автоматическая миграция перестает быть легкой, я предполагаю, что она использует связанную модель. Удаление модели отображения из цели возвращает время обработки к ~ 4 секундам для облегченного автоматического режима

. Это определенно противоречит интуиции. Достаточно ли прост ваш проект, чтобы опубликовать его в качестве примера этой неэффективности, или у вас, возможно, есть тестовый проект, который изолирует эту проблему? В любой ситуации было бы очень полезно взглянуть на это, чтобы мы могли: а) надеяться разгадать загадку; или B) сообщить об этом как о довольно крупной ошибке в Apple, поскольку, безусловно, должно иметь место обратное.

Насколько велик набор данных, с которым вы работаете?

2
ответ дан 4 December 2019 в 03:38
поделиться