如何避免 NSFileWrapper 在写入文件时使用大量内存
How can I avoid having NSFileWrapper use lots memory when writing the file
我有一个应用程序正在使用 NSFileWrapper
创建用户数据的备份。此备份文件包含文本和媒体文件(此处与压缩无关)。有时这些备份文件会变得非常大,超过 200 MB。当我调用 NSFileWrapper -writeToURL...
时,它似乎将整个内容加载到内存中作为写入过程的一部分。在旧设备上,这会导致我的应用程序由于内存限制而被系统终止。
有没有一种简单的方法可以避免 NSFileWrapper
将所有内容加载到内存中?我已经通读了这里我能找到的所有 NSFileWrapper
个问题。关于如何解决这个问题有什么建议吗?
这是备份文件的当前文件结构:
BackupContents.backupxyz
user.txt
- folder1
- audio files
asdf.caf
asdf2.caf
- folder2
- audio files
asdf3.caf
再次强调,请不要告诉我压缩我的音频文件。那只会是对有缺陷的设计的创可贴。
似乎我可以 move/copy 使用 NSFileManager
将所有文件放入一个目录,然后将该目录作为一个包。我应该走那条路吗?
当 NSFileWrapper
树被写入磁盘时,它会尝试将原始文件硬 link 到新位置,但前提是您为originalContentsURL
。
听起来您正在以编程方式构建文件包装器(用于备份方案),因此您的文件可能散布在整个文件系统中。这意味着当您 writeToURL
时,您 没有 originalContentsURL
。这意味着 hard-link 逻辑将被跳过,文件将被加载以便重写。
因此,如果您想要硬 linking 行为,则需要找到一种方法来提供 originalContentsURL
。通过向初始 writeToURL
调用提供适当的 URL 最容易做到这一点。
或者,您可以尝试对常规文件进行 NSFileWrapper
子类化,并为它们提供一个 NSURL
以便它们在内部保留。您需要覆盖 writeToURL
才能将这个新的 URL 传递到 super
,但是 URL 应该足以触发硬 link 代码。然后,您希望将 NSFileWrapper
的这个子类用于您想要硬 link 放入的大文件。
我有一个应用程序正在使用 NSFileWrapper
创建用户数据的备份。此备份文件包含文本和媒体文件(此处与压缩无关)。有时这些备份文件会变得非常大,超过 200 MB。当我调用 NSFileWrapper -writeToURL...
时,它似乎将整个内容加载到内存中作为写入过程的一部分。在旧设备上,这会导致我的应用程序由于内存限制而被系统终止。
有没有一种简单的方法可以避免 NSFileWrapper
将所有内容加载到内存中?我已经通读了这里我能找到的所有 NSFileWrapper
个问题。关于如何解决这个问题有什么建议吗?
这是备份文件的当前文件结构:
BackupContents.backupxyz
user.txt
- folder1
- audio files
asdf.caf
asdf2.caf
- folder2
- audio files
asdf3.caf
再次强调,请不要告诉我压缩我的音频文件。那只会是对有缺陷的设计的创可贴。
似乎我可以 move/copy 使用 NSFileManager
将所有文件放入一个目录,然后将该目录作为一个包。我应该走那条路吗?
当 NSFileWrapper
树被写入磁盘时,它会尝试将原始文件硬 link 到新位置,但前提是您为originalContentsURL
。
听起来您正在以编程方式构建文件包装器(用于备份方案),因此您的文件可能散布在整个文件系统中。这意味着当您 writeToURL
时,您 没有 originalContentsURL
。这意味着 hard-link 逻辑将被跳过,文件将被加载以便重写。
因此,如果您想要硬 linking 行为,则需要找到一种方法来提供 originalContentsURL
。通过向初始 writeToURL
调用提供适当的 URL 最容易做到这一点。
或者,您可以尝试对常规文件进行 NSFileWrapper
子类化,并为它们提供一个 NSURL
以便它们在内部保留。您需要覆盖 writeToURL
才能将这个新的 URL 传递到 super
,但是 URL 应该足以触发硬 link 代码。然后,您希望将 NSFileWrapper
的这个子类用于您想要硬 link 放入的大文件。