![](/img/trans.png)
[英]Core Data iPhone how often should I call [managedObjectContext save:&error] when doing 50k record insert?
[英]How often should I save to Core Data?
我正在开发一个由Core Data支持的应用程序。 现在,当我在Context中添加或删除实体时,我正在保存对象上下文。 我担心它会影响性能,所以我想延迟保存。 事实上,我可以一直延迟它直到应用程序终止。 仅在应用程序即将关闭时保存数据是否风险太大? 我应该多久调用一次对象上下文的保存?
我想有一个单独的线程处理保存:它将等待信号量。 每次应用程序的任何部分调用helper / util方法来保存Core Data时,它都会减少信号量。 当它降到零时,“保存线程”将执行一次保存,并将信号量增加到a,比如5,然后再次休眠。
有什么好建议吗? 谢谢!
你应该经常保存。 保存操作的实际性能与您正在使用的持久性存储类型有很大关系。 由于二进制和XML存储是原子的,因此需要在每次保存时将它们完全重写为磁盘。 随着对象图的增长,这可能会使您的应用程序变慢。 另一方面,SQLite存储更容易逐步写入。 因此,虽然会有一些东西写在你正在保存的对象之上和之外,但开销远远低于原子存储类型。 无论整体对象图形大小如何,保存仅影响少数对象的速度总是很快。
也就是说,如果您在循环中导入数据,比方说,我会等到完成操作结束后才能保存而不是保存每次迭代。 您的主要目标应该是防止数据丢失。 (我发现用户并不关心这一点!)性能应该紧随其后。 您可能需要做一些工作来平衡保存与性能的频率,但除非您已经确定了特定且重要的性能问题,否则您在上面概述的解决方案似乎有些过分。
我认为最好的方法是在每个对象之后保存。 如果发生突然崩溃等事情,将不会丢失任何东西。
如果添加大量对象,一些性能增强是批量处理。 将所有对象添加到上下文而不是保存。 例如,如果在循环中添加批次对象,则这很好。 你的想法很相似,但是在保存之间可能需要很长时间,程序可能会崩溃。
我不认为添加单个对象会是一个很大的性能问题。 你的对象有多大,它们包含大量数据吗?
其他答案中未提及的一个问题是,您的解决方案(涉及使用后台线程)不应在另一个线程中使用的托管对象上下文上运行。 通常,您为后台线程创建一个新的MOC,但如果您保存到不同/未修改的背景MOC,则会失败保存的目的。
所以你的问题有几个答案:
你真的希望尽可能地立即保存,所以至少我的建议是节流而不是任意设置任何计时器或倒计时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.