Зашифрованные данные ядра занимают уйму времени при удалении более 400 тыс. Записей

Я использую Encrypted CoreData Sqlite Store для шифрования моего стека CoreData. У меня есть таблица в базе данных, которая хранит более 400 тыс. Записей. Я хочу удалить большинство этих записей, основываясь на некоторых действиях. Поскольку пакетное удаление недоступно для этого зашифрованного хранилища, мне нужно выполнить запрос на выборку для чтения данных.

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")
fetchRequest.includesPropertyValues = false
// Fetch data till minimum threshold limit
let newPredicate = NSPredicate(format: "%K <= %@", "recordTime", NSNumber(value: maxAllowedTimeStamp as Int64))
fetchRequest.predicate = newPredicate
let objectsToDelete = myDataController.executeFetchRequest(fetchRequest) as? [NSManagedObject]

Затем я выполняю операцию удаления объектов один за другим:

for object in objectsToDelete {
    myDataController.deleteManagedObject(object)
}

Эта операция занимает более 7-8 минут. Я полагаю, что данные ядра достаточно быстры, чтобы предоставить объект сбоя, и это не должно занимать так много времени, поскольку вы можете видеть мой предикат, в котором я не принимаю никакого значения свойства, чтобы сократить время выборки.

Может ли кто-нибудь помочь мне понять, что занимает так много времени, чтобы удалить объекты?

1 ответ

Что занимает так много времени, так это то, что вы удаляете 400 тыс. Объектов по одному за раз. Речь идет не о шифровании или, по крайней мере, не об этом. Этот вид операции всегда был медленным и является причиной добавления пакетных удалений.

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

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