加密的核心数据在删除 40 万多条记录时需要花费大量时间

Posted

技术标签:

【中文标题】加密的核心数据在删除 40 万多条记录时需要花费大量时间【英文标题】:Encrypted core data take hell lot of time in deleting 400k+ records 【发布时间】:2017-09-05 09:06:24 【问题描述】:

我正在使用 Encrypted CoreData Sqlite Store 来加密我的 CoreData 堆栈。我在数据库中有一个存储超过 40 万条记录的表。我想根据某些活动删除大部分记录。由于此加密存储无法批量删除,因此我需要执行 fetch 请求以读取数据。

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 分钟以上。我相信核心数据足够快以提供故障对象,并且它不应该花费这么多时间,因为您可以看到我的谓词,其中我没有获取任何属性值以减少获取时间。

有人可以帮我理解删除对象需要这么长时间吗?

【问题讨论】:

Hello Kapil 批量删除选项是最好的,因为迭代整个数据和删除将花费您大量的时间。试试这个链接***.com/questions/23201917/… 来加密/保护您的数据并尝试批量删除 【参考方案1】:

您一次删除 40 万个对象需要这么长时间。这不是关于被加密,或者至少不是主要关于那个。这种操作一直很慢,这也是添加批量删除的原因。

在没有批处理的情况下删除这么多记录基本上是一个非常缓慢的过程。如果您不能使用批量删除,则需要认真考虑为什么需要删除这么多对象以及是否可以避免这种情况。如果您要全部删除它们,也许不要创建这么多。或者也许不要删除它们——因为如果你创建了一次,也许你以后再创建它们?或者,如果它是用户帐户数据的离线缓存,则可能不要获取所有这些数据。或者,可以通过删除持久存储文件而不是逐个删除对象来处理删除。

【讨论】:

CoreData 中相同的过程大约需要 150 秒并且不会引发内存警告,而在加密存储中需要超过 5 分钟并引发内存警告并崩溃。所以我猜这个加密存储有问题。 150 秒仍然是一个非常长的时间。我坚持我的分析。加密可能会使情况变得更糟,但它已经很糟糕了,这并不重要。

以上是关于加密的核心数据在删除 40 万多条记录时需要花费大量时间的主要内容,如果未能解决你的问题,请参考以下文章

sqlite插入一万多条数据会报内存溢出 该怎么解决

ios:使用核心数据同时保存/更新多条记录

laravel 中删除多条记录

使用 NSFetchedResultsController 搜索核心数据实体记录

Oracle中delete使用in做条件删除多条时删除失败

如何确定正在删除哪些记录?