【问题标题】:Estimating/forecasting download completion time估计/预测下载完成时间
【发布时间】:2010-12-25 07:07:13
【问题描述】:

我们都取笑过“还剩 X 分钟”对话框,这似乎太简单了,但我们该如何改进呢?

实际上,输入是截至当前时间的一组下载速度,我们需要使用它来估计完成时间,也许有确定性的指示,例如使用 Y% 的“剩余 20-25 分钟”置信区间。

完成此操作的代码可以放在一个小库中并在所有项目中使用,所以真的有那么难吗?你会怎么做?您对以前的下载速度有什么重视?

或者是否已经有一些开源代码?

编辑:总结:

  1. 通过更好的算法/过滤器等提高估计完成时间。
  2. 提供间隔而不是单个时间('1h45-2h30 分钟'),或者只限制精度('大约 2 小时')。
  3. 指示进度何时停止 - 尽管如果进度持续停止然后继续,我们应该能够处理它。也许“大约 2 小时,目前停滞不前”

【问题讨论】:

标签: algorithm math estimation probability


【解决方案1】:

更一般地说,我认为您正在寻找一种方法来即时测量传输速度,这通常是通过一小段时间的平均值获得的。

问题一般是为了反应,周期通常极小,导致悠悠球效应。

我会提出一个非常简单的方案,让我们对其进行建模。

想象曲线速度 (y) 随时间 (x) 的变化。

  1. 即时速度,只不过是读取当前 x (x0) 的 y。

  2. 平均速度,不超过Integral(f(x), x in [x0-T,x0]) / T

  3. 我建议的方案是应用一个过滤器,给最后时刻更多的权重,同时仍然考虑过去的时刻。

它可以很容易地实现为g(x,x0,T) = 2 * (x - x0) + 2T,这是一个简单的表面T三角形。

现在您可以计算Integral(f(x)*g(x,x0,T), x in [x0-T,x0]) / T,这应该可以工作,因为这两个函数总是正数。

当然,您可以使用不同的g,只要它在给定区间内始终为正,并且它在区间上的积分为 T(因此它自己的平均值正好为 1)。

这种方法的优势在于,由于您更重视即时事件,因此即使您考虑更大的时间间隔,您也可以保持相当的反应(这样平均值会更精确,并且不易受到打嗝的影响)。

此外,我很少看到但认为会提供更精确估计的方法是将用于计算平均值的时间与估计的剩余时间相关联:

  • 如果我下载一个5ko文件,它会立即加载,无需估计
  • 如果我下载一个 15 Mo 的文件,大概需要 2 分钟,所以我想估计一下……每 5 秒?
  • 如果我下载一个 1.5 Go 文件,这将需要......大约 200 分钟(以相同的速度)......也就是说 3 小时 20 分钟......也许每分钟估计一下就足够了?

因此,下载所需的时间越长,我需要的反应就越少,并且我可以平均越多。一般来说,我会说一个窗口可以覆盖总时间的 2%(也许除了少数初步估计,因为人们喜欢即时反馈)。此外,一次显示整个 % 的进度就足够了。如果任务很长,我无论如何都准备等待。

【讨论】:

  • 非常好,但积分可能被过度设计了。让我们称之为最近几个样本的加权平均值。 :-)
  • @Konrad: 是的,这是为了数学上的严谨性,鼓励实际实现来近似它^^
【解决方案2】:

我想知道,状态估计技术会在这里产生好的结果吗?像卡尔曼滤波器这样的东西?

基本上,您通过查看当前模型来预测未来,并在每个时间步更改模型以反映现实世界的变化。我认为这种技术用于估计笔记本电脑电池的剩余时间,这也会根据使用情况、电池使用年限等而有所不同。

请参阅http://en.wikipedia.org/wiki/Kalman_filter 以获得对该算法的更深入描述。

过滤器还提供了一个方差度量,可用于表明您对估计的信心(尽管正如其他答案所提到的,将其展示给最终用户可能不是最好的主意)

有谁知道这是否实际用于下载(或文件复制)估计?

【讨论】:

  • Kalman 要求您提供模型,它不会构建模型。它只是使用您给它的模型和嘈杂的测量结果来尝试找出当前(隐藏)状态。
  • 当然你需要一个模型,你可以从一个简单的模型开始,假设下载速率是恒定的,过滤器会根据证据调整下载速率的值。
【解决方案3】:

不要通过提供比他们需要的更多信息来混淆您的用户。我在考虑置信区间。跳过它。

互联网下载时间变化很大。微波炉会干扰 WiFi。使用情况因一天中的时间、一周中的某一天、假期和新的激动人心的游戏的发布而异。服务器现在可能负载很重。如果您将笔记本电脑带到咖啡馆,结果将与在家中有所不同。因此,您可能无法依靠历史数据来预测下载速度的未来。

如果您无法准确估计剩余时间,那么不要通过提供这样的估计来欺骗您的用户

如果您知道必须下载多少数据,您可以提供已完成进度的百分比

如果您根本不知道,提供“心跳” - 一个移动的 UI,向用户显示事情正在运行,即使您不知道还剩多长时间。

【讨论】:

  • 非即时但几乎是速度测量(最后 5 秒?)对于判断它是否进展顺利非常有用。我说不是很快,因为我不止一次看到估计的下载速度在每秒 Tera/Petabyte 范围内:)
  • 这个东西的目的主要是为了改进给用户的信息。因此,不要说由于给出了过高的精度(“剩余 24 分钟 4.2 秒”)估计是准确的,也不是说它不会因为给出单个值而不是间隔等而改变。当然,如果估计者发现输入太可变,它可以表明相反。
【解决方案4】:

提高估计时间本身:直觉上,我猜网络连接的速度是围绕某个临时平均速度的一系列随机值 - 事情以一个速度运行,然后突然变慢或加速。

然后,一个选项可以是通过某种指数对之前的一组速度进行加权,以便最近的值获得最强的权重。这样,随着先前的平均速度进一步移动到过去,它对当前平均值的影响就会减小。

但是,如果速度随机波动,则可能值得将指数的顶部变平(例如,通过使用 Gaussian filter),以避免太大的波动。

总而言之,我正在考虑测量标准偏差(可能限于最后 N 分钟)并使用它来生成应用于输入的高斯滤波器,然后使用标准偏差限制引用的精度.

但是,您如何将标准差计算限制在最后 N 分钟?你怎么知道使用多长时间?

或者,可以通过模式识别来检测我们是否达到了稳定的速度。

【讨论】:

    【解决方案5】:

    我自己断断续续地考虑过这个问题。我的答案是在计算当前(以及未来)传输速率时保持保守,并包括在更长的时期内进行平均,以获得更稳定的估计。也许对显示的时间进行低通滤波,这样就不会在 2 分钟到 2 天之间跳跃。

    我认为置信区间不会有帮助。大多数人无法解释它,它只会显示更多猜测的内容。

    【讨论】:

    • 我认为一个简单的信心指示会起作用,例如“20-25 分钟”。至少限制所提供值的精度是值得的——“大约 2 小时”而不是“2 小时 16 分钟”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多