iOS - 将数组保存到磁盘所需的时间

Posted

技术标签:

【中文标题】iOS - 将数组保存到磁盘所需的时间【英文标题】:iOS - Time taken to save an array to disk 【发布时间】:2012-03-05 06:58:43 【问题描述】:

我正在使用以下代码将 NSMutableArray 保存到磁盘:

[myArray writeToFile:filePath atomically:YES];

假设数组大约有 400 个对象,谁能告诉我通过这种方法保存是否是一个耗时的过程?目前,文件有可能以相当快的速度连续保存多次(我正在尝试修复),但我想知道如果数组变得更大,这是否会在某个阶段导致问题?

亲切的问候

【问题讨论】:

你期待什么样的问题? 好吧,夸大其词,如果保存需要 20 秒并且一个方法尝试保存到一个文件,然后另一个方法尝试在“20 秒”之前保存到同一个文件是up,会不会导致数据损坏? 只要考虑磁盘 I/O 成本高。如果您的数据连续快速变化,请尝试在内存中自行管理。在绝对必要时写入。 【参考方案1】:

作为参考,iPod Touch 4 闪存写入速度约为 18 MB/s(我使用来自this 文章的代码进行测量)。

您可以通过转到 Xcode Organizer → 设备选项卡 → 在您的设备中选择应用程序 → 您的应用程序 → 选择文件并按下载来查看设备上保存文件的大小。

模拟器请转至~/Library/Application Support/iPhone Simulator/<ios version>/Applications/<App ID>/Documents

【讨论】:

【参考方案2】:

这里有几件事 -

    通常尽量限制 I/O 事务的数量。 如果您可以尝试通过使用某种内存缓存来限制 I/O,并仅在需要时将缓存刷新到磁盘。 接下来为您执行 I/O 任务;只有一个线程写入和读取您的文件。如果你不能确保这一点,那么你需要实现某种文件锁定机制等。所有这些都会变得丑陋。最好只有一个线程同时进行写作和阅读。这样,任务就被序列化了。

【讨论】:

【参考方案3】:

而不是写例如每次更新数组时,为什么不将更改保留在内存中,并在 applicationDidMoveToBackground 或其他确保在应用程序被终止之前写入的应用程序事件中将它们刷新到磁盘?

【讨论】:

以上是关于iOS - 将数组保存到磁盘所需的时间的主要内容,如果未能解决你的问题,请参考以下文章

gulp.src() 没有读取所需的 JSON 文件的数组值

gulp.src() 没有读取所需的 JSON 文件的数组值

iOS - 将图像数组保存到 CoreData

为啥将许多小字节数组写入文件比写入一个大数组要快?

无法将文本文件读入所需的数组格式

使用 QtWebEngine 将图像保存到磁盘