2

来自 iPhone 编程指南

创建文件或写出文件数据时,请牢记以下准则:

  1. 尽量减少写入磁盘的数据量。文件操作相对较慢,并且涉及到闪存盘的写入,闪存盘的使用寿命有限。一些帮助您最小化文件相关操作的具体提示包括:
    1. 仅写入文件中已更改的部分,但尽可能汇总更改。
    2. 避免写出整个文件只是为了改变几个字节。
    3. 在定义文件格式时,将经常修改的内容组合在一起,以尽量减少每次需要写入磁盘的总块数。
    4. 如果您的数据包含随机访问的结构化内容,请将其存储在 Core Data 持久存储或 SQLite 数据库中。如果您正在处理的数据量可能增长到超过几兆字节,这一点尤其重要。
  2. 避免将缓存文件写入磁盘。此规则的唯一例外是当您的应用程序退出时,您需要编写可用于在下次启动时将应用程序恢复到相同状态的状态信息。

不久前我读了一篇关于英特尔 SSD 的文章(很遗憾,我现在找不到),其中提到主要的寿命问题是由于操作系统实际上并没有删除数据,而只是将块标记为免费,当那些“空闲”块被写入(导致读取-修改-存储,而不仅仅是存储)时,会导致相当痛苦的减速。这是否也适用于 iPhone,即当文件被更频繁地删除时,驱动器是否更容易减速?

我正在考虑基于重做日志的文件格式,这样我可以维护跨会话撤消,并且我也没有随机写入(总是追加),但在某些时候我想我至少必须整合日志的一部分,以将文件大小保持在合理的水平。在这种情况下,我的问题是哪个更有效(就驱动器寿命而言)?我有几条我考虑过的路径

  1. 覆盖同一个文件并
    1. 截断我不需要的空间
    2. 或留下该空间(充满旧数据)并在我再次需要时覆盖它
  2. 或者写一个新文件,然后删除旧文件

但我愿意接受建议。我猜典型的文件大小从几 kB 到几百 kB 不等,但更高的值更多的是推测。

4

1 回答 1

2

你不必担心那个特定的问题。像许多嵌入式设备一样,iPhone 直接与闪存芯片通信,使用类似于 SSD 控制器芯片使用的接口(类似于 ONFI)。iPhone 上的 FTL(闪存翻译层)是由操作系统管理的软件,它完全了解正在使用的块。

虽然 Apple 没有记录这种行为,但您可以在公共 xnu 源代码中间接看到它的证据,该源代码(在相当长的一段时间内)支持 HFS+ 与块层通信特定块不再有用。没有开源块设备对这些信息做任何事情,但如果你拿一部越狱的 iPhone 并反汇编它的内核,你会看到它在 iPhone 上使用。

显然你不应该试图依赖这种行为,我只是说你不需要担心,它会做正确的事情。

于 2009-11-30T10:19:18.750 回答