后台上传大量数据

Posted

技术标签:

【中文标题】后台上传大量数据【英文标题】:Background upload of large amount of data 【发布时间】:2017-07-10 11:55:22 【问题描述】:

我需要将大量照片从我的 ios 设备上传到服务器。例如,500 张照片。我应该如何正确地做到这一点?

我使用 NSURLSession 为每张照片创建了带有后台会话配置的上传任务。我尝试制作自己的自定义队列,其中每个下一个任务将在前一个任务完成后启动。但在某一时刻,新的任务并没有开始。我猜,因为这一切都发生在后台。更多关于这个问题,你可以阅读here

(如果使用队列的方法是正确的,请您建议一个好的异步任务队列实现,因为我可能在我的实现中搞砸了一些东西)

所以在上面链接的文章之后,我的猜测是我应该立即开始所有上传任务(而不是一个接一个)。但我有效率问题。如果我为每张照片创建一个任务,它将有 500 个后台异步任务和大约 1 GB 的数据并行上传。我想,这会导致网络出现问题。

综上所述,在iOS(我的情况下是500张照片)的正确方法是什么?

【问题讨论】:

【参考方案1】:

不幸的是,由于糟糕的设计决策,Apple 的 API 在这项任务上表现不佳。您面临几个主要障碍:

您可以同时创建的任务数量是有限制的。我认为性能在大约 100 个任务时开始下降。 操作系统唤醒您的应用程序的频率是有限制的。它唤醒您的应用程序的频率越高,它在再次唤醒它之前等待的时间就越长。在某些时候,这将导致无法安排新任务。 如果发生故障,上传不会从中断处继续;他们重新启动。这可能会在糟糕的网络上导致巨大的带宽成本。

我怀疑最好的方法是:

将请求分成几个大组,每个组都可以写入单个 ZIP 存档,该存档不会太大而导致用户磁盘空间不足,但也不会太小以至于上传太快。 将这些文件的第一组写入单个文件(例如 ZIP 格式)。 在服务器端使用自定义脚本,通过添加额外的 CGI 参数,您可以从中断处继续上传。 失败时,询问服务器它获取了多少数据,然后截断文件的前面并从当前位置重新上传。 成功后,计算第一个大文件完成上传的速度,如果不是 O(分钟),则合并接下来的几组。将集合写入文件,然后开始下一个请求。

需要注意的是,所有这些都必须相当快地完成。您可能会发现有必要提前将文件预先组合到 ZIP 存档中以避免被杀死。但是不要试图将它们合并到一个文件中,因为这样在重试时截断头部会花费很长时间。 (从表面上看,您还可以提供任何参数作为 URL 的一部分,并使 POST 正文成为原始数据,并提供一个文件流以从 ZIP 存档中从偏移量开始读取。)

如果您还没有将头撞到墙上,那么您很快就会撞到。 :-)

【讨论】:

【参考方案2】:

要下载这么多图像,您可能需要询问 用户不要停止应用程序或进入后台模式。

因为在这两种情况下,我们将无法完成这么大的任务。

如果用户手机处于激活状态,

为每个上传过程创建一个NSoperation。在您的情况下,它可能在 500 左右。

然后将NSOperations 添加到名为NSOperationQueue 的队列中,然后启动NSOperationQueue 任务。

它会一一执行。

有关缓存等更多详细信息,请关注SO POST

这里是Swift Version

【讨论】:

上传这么多数据显然需要时间。要求用户保持应用打开听起来像是糟糕的用户体验。真的没有办法将该上传移至后台吗? Google Photos、Dropbox 和类似这样的服务以某种方式做到了这一点 请查看此答案***.com/a/41379720/5215474 .. 除非音乐播放器等特殊情况,否则任何应用程序都无法在后台运行 您的答案不正确。我并没有首先询问应用程序终止。并且 App Store 中有应用程序在后台(即保管箱)中上传大量照片,所以我的任务是可能的。 请阅读有关后台任务的苹果文档并阅读帖子***.com/a/28283577/5215474 I do not have to consider NSURLSession for uploading a small amount of data. And besides, it's uploading task, it can take as much time as it wants. 这是您链接的帖子的引用。我将这个后台配置用于 NSURLSession 进行后台上传。你可以阅读它here

以上是关于后台上传大量数据的主要内容,如果未能解决你的问题,请参考以下文章

前台有大量数据要提交到后台并插入数据库

微信小程序后台返回大量多余数据的处理

后台导出大量数据超时报 nginx404错误

在 Rails 中运行大量长时间运行的后台作业

前端提交大量数组至PHP后台,数据被截断

php怎么导出大量数据的Excel