Tag: 大数据

如何在后台线程上高效地写入大文件到磁盘(Swift)

更新 我已经解决并删除了分心的错误。 如果还有任何问题,请阅读整篇文章,随时留下意见。 背景 我试图在iOS上使用Swift 2.0,GCD和完成处理程序将相对较大的文件(video)写入磁盘。 我想知道是否有更有效的方法来执行这项任务。 该任务需要在不阻塞主UI的情况下完成,同时使用完成逻辑,并确保操作尽可能快。 我有一个NSData属性的自定义对象,所以我目前正在NSData上使用扩展实验。 作为一个例子,备用解决scheme可能包括使用NSFilehandle或NSStreams以及某种forms的线程安全行为,从而比基于当前解决scheme的NSData writeToURL函数产生更快的吞吐量。 无论如何,NSData有什么问题? 请注意以下从NSData类参考( 保存数据 )的讨论。 我执行写入我的临时目录,但是我有一个问题的主要原因是,我可以看到在处理大型文件时在UI中明显的滞后。 这种滞后正是因为NSData不是asynchronous的(Apple Docs注意到primefaces写入会导致“大”文件的性能问题〜> 1mb)。 所以当处理大文件时,任何内部机制在NSData方法中都是有效的。 我做了一些更多的挖掘,并从苹果发现这个信息…“这种方法是理想的转换数据:/ / URL到NSData对象,也可用于同步阅读短文件如果您需要阅读可能的大文件 ,使用inputStreamWithURL:打开一个stream,然后一次读取一个文件。“ ( NSData类参考,Objective-C,+ dataWithContentsOfURL )。 这个信息似乎意味着如果将writeToURL移动到后台线程(如@jtbandes所build议的)是不够的,我可以尝试使用stream将文件写入后台线程。 NSData类及其子类提供了快速方便地将其内容保存到磁盘的方法。 为了尽量减less数据丢失的风险,这些方法提供了primefaces保存数据的选项。 primefaces写保证数据要么全部保存,要么完全失败。 primefaces写入通过将数据写入临时文件开始。 如果写入成功,则该方法将临时文件移动到其最终位置。 尽pipeprimefaces写入操作可以最大限度降低由于损坏或部分写入的文件而导致数据丢失的风险,但在写入临时目录,用户的主目录或其他可公开访问的目录时,它们可能并不合适。 任何时候您使用可公开访问的文件时,都应该将该文件视为不可信且潜在危险的资源。 攻击者可能会妥协或损坏这些文件。 攻击者也可以使用硬链接或符号链接replace文件,导致写操作覆盖或损坏其他系统资源。 在可公开访问的目录中工作时,避免使用writeToURL:atomically:方法(和相关的方法)。 而是使用现有的文件描述符来初始化NSFileHandle对象,并使用NSFileHandle方法来安全地写入文件。 其他select 关于并发编程objc.io上的一篇文章提供了有关“高级:背景下的文件I / O”的有趣选项。 一些选项也涉及到使用InputStream。 苹果公司也有一些旧的引用来读取和写入文件asynchronous 。 我正在发布这个问题,预计Swift的替代品。 一个合适的答案的例子 下面是可能满足这类问题的适当答案的一个例子。 (采取stream编程指南, 写入输出stream ) 使用NSOutputStream实例写入输出stream需要几个步骤: 用写入数据的存储库创build并初始化一个NSOutputStream的实例。 […]