在 iOS 中高效存储大量数据

Posted

技术标签:

【中文标题】在 iOS 中高效存储大量数据【英文标题】:Efficient storage of large amounts of data in iOS 【发布时间】:2011-08-11 13:49:37 【问题描述】:

我正在构建一个具有“记录”功能的应用程序,该功能可以记录用户随时间的交互。随着时间的推移,我用表示用户输入当前状态的“状态”对象填充内存中的一个数组。一个典型的记录会产生大约 5k 个这样的对象。

然后我使用NSKeyedArchiver archiveRootObject: toFile: 归档这些数据。这工作正常,但是文件大小非常大(3.5 兆左右)。我的问题是这样的:

归档文件是否存在任何固有的文件大小开销?如果我使用 SQLite 甚至滚动我自己的文件格式,我是否能够使用更少的磁盘空间来保存这些数据?或者减少数据磁盘大小的唯一方法是减少我存储的数字的位深度?

【问题讨论】:

查看核心数据框架。 Apple 在开发者网站上提供了有关该主题的必看视频。 谢谢摩西。你认为我可以通过使用 Core Data 而不是 NSKeyedArchiver 来使用更少的磁盘空间吗? 存储技术不会改变您的数据足迹。如果您想减小文件大小,您必须找出我们自己的修剪/压缩数据的方法。使用 SQLITE 与核心数据不会改变数据占用的空间量,它们只是写入和检索所述数据的不同方法。无论您选择何种技术,您都可以使用设备的最大存储容量。 谢谢马特。我意识到 Core Data 使用 SQLite 进行存储。我想知道 SQLite 数据存储和使用 NSKeyedArchiver 归档对象之间的占用空间是否有任何差异。 【参考方案1】:

如果您关心的是性能,Core Data 会为您提供更多的粒度。您可以在应用程序执行期间延迟加载和保存部分,而不是加载/保存整个 3.5Mb 对象图。

如果您关心文件大小,这是binary plist format,这是SQLite file format。但比开销更重要的是对象图和核心数据模型之间的转换有多复杂。

您可能还对几种文件格式的速度和性能比较感兴趣:https://github.com/eishay/jvm-serializers/wiki/不确定所有文件是否都有 C、C++ 或 Objective-C 实现。

【讨论】:

【参考方案2】:

3.5 MB 不是一个很大的文件。但是,如果您的应用程序必须一直加载或保存 3.5 MB 的文件,那么使用 Core Data 会更智能,因为这允许您仅保存已更改的数据并仅检索您感兴趣的部分 - - 不是每次都完整。

【讨论】:

它将是 3.5 megs 乘以 10 左右。我需要保存大约十组不同的数据,并且我想在应用的初始下载中包含所有这些数据。 仍然只有 35 MB。对于稍微大一点的下载,因此如果您可以将其压缩到 20 MB 以下,那只是为了更好,但作为设备上的存储,它是花生。【参考方案3】:

如果存储是主要关注点,那么黑白 sqlite 和核心数据几乎没有区别。

我不得不在应用程序中存储带有状态的 UIViewControllers,最终我没有保存序列化的对象,而是只保存了最具体的属性并创建了一个读取该数据并重新分配这些对象的类。

然后将属性映射存储在 csv [诚然很难管理,但像任何东西一样小],然后进行压缩。

【讨论】:

感谢阿比尼特的回复。但我不是在问 sqlite 与核心数据,我问的是 NSKeyedArchiver 与核心数据。 好的。甚至 NSKeyedArchiver 也保存了整个对象。所以它也不会对最终文件大小产生太大影响。我认为这里的关键是尽可能少地保存数据。除非您绝对必须保存该对象的所有内容。

以上是关于在 iOS 中高效存储大量数据的主要内容,如果未能解决你的问题,请参考以下文章

行存储和列存储

需要高效的内存方式来存储大量字符串(以前是:Java 中的 HAT-Trie 实现)

高效更新大量核心数据记录

Oracle:高效插入大量数据经验之谈

从mysql服务器访问和存储大量数据

如何高效地向Redis写入大量的数据