估计/预测下载完成时间

15
我们常常嘲笑那些看似太过简单的“剩余X分钟”对话框,但是我们该如何改进它呢?
实际上,输入是截至当前时间的下载速度集合,我们需要利用这些数据来估算完成时间,并且可以使用某个Y%置信区间来指示估算的准确性,例如“还剩20-25分钟”,可以放到一个小型库中,在项目中随处使用。所以,这真的很困难吗?你会怎么做?你会给以前的下载速度赋予什么权重?
或者已经有一些开源代码了吗?
编辑:总结: 1.通过更好的算法/滤波器等改进预计完成时间。 2.提供时间区间而不是单一时间(“1小时45-2小时30分钟”),或者仅限制精度(“大约2小时”)。 3.指示进程何时停止 - 尽管如果进程一直停滞然后继续进行,我们应该能够处理它。也许可以显示“大约2小时,目前停滞”。

4
必备的xkcd参考:http://www.xkcd.com/612/ (说明:该链接是一个网络漫画,可能需要打开才能查看。) - jason
智能进度条和ETA计算的副本。 - Cees Timmerman
5个回答

12
更通用地说,我认为您正在寻找一种即时测量传输速度的方法,该方法通常是在一个小时间段内获得的平均值。
通常问题是,为了具有反应性,该时间段通常非常短,这导致了"yoyo"效应。
我建议采用非常简单的方案,让我们对其进行建模。
考虑时间(x)上的曲线速度(y)。
即时速度不过是读取当前x(x0)的y。
平均速度不过是Integral(f(x), x in [x0-T,x0]) / T。
我提出的方案是应用滤波器,在仍然考虑过去时刻的同时,更加重视最近的时刻。
它可以很容易地实现为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),就可以有一个不同的g。
这种方法的优点是,因为您更加重视即时事件,所以即使考虑更长的时间间隔(因此平均值更精确且不那么容易出现问题),您仍然可以保持相当反应迅速。
另外,我很少看到但认为会提供更精确估计的是将用于计算平均值的时间与估计剩余时间进行相关:
如果我下载一个5ko文件,它将立即加载,无需估计
如果我下载一个15 Mo文件,它大约需要2分钟,所以我希望每5秒进行一次估计?
如果我下载一个1.5 Go文件,它将花费…大约200分钟(以同样的速度)…也就是说3h20m…也许每分钟估计一次就足够了?
因此,下载所需时间越长,我需要反应的就越少,我就可以更多地进行平均。通常,我会说一个窗口可以覆盖总时间的2%(也许除了最初的几个估计,因为人们喜欢即时反馈)。此外,每次以整数百分比为单位指示进度即可。如果任务很长,我已经准备好等待了。

3
很好,但是这个积分可能有点过度设计了。我们可以简单地称其为最近几个样本的加权平均值。 :-) - Konrad Garus
4
@Konrad:确实,这是为了数学严谨性,实际实现鼓励近似计算^^ - Matthieu M.

8
我想知道,使用状态估计技术是否能在这里产生良好的结果?类似于卡尔曼滤波器这样的东西?
基本上,你通过查看当前模型来预测未来,并在每个时间步骤更改模型以反映对现实世界的变化。我认为这种技术用于估算笔记本电池剩余时间,这也可以根据使用情况、电池年龄等而变化。
有关算法的更深入描述,请参见http://en.wikipedia.org/wiki/Kalman_filter
该滤波器还提供方差度量,可用于指示您对估计的信心(尽管其他答案已经提到,向最终用户显示可能不是最佳选择)。
有人知道这是否在某些下载(或文件复制)估计中实际使用吗?

Kalman需要您提供一个模型,它本身不会构建一个模型。它只是使用您提供的模型和有噪声的测量结果来尝试推断出当前(隐藏的)状态。 - Jay Kominek
1
当然,你需要一个模型,可以从一个简单的模型开始,假设下载速率是恒定的,然后根据证据调整下载速率的值。 - Yair

4
不要提供比用户需要的更多信息,以免混淆用户。我在考虑置信区间,跳过它。
网络下载时间高度不稳定。微波会干扰WiFi。使用情况因每天的时间、星期几、节假日和新游戏发布而变化。服务器现在可能负载很重。如果你把笔记本电脑带到咖啡馆,结果会与在家里不同。因此,你可能不能依靠历史数据来预测未来的下载速度。
如果你无法准确估计剩余时间,则不要向用户提供这样的估计,以免欺骗用户。
如果你知道必须下载多少数据,则可以提供百分比完成进度。
如果你完全不知道,则提供一个“心跳”——一个移动的UI部件,向用户展示正在工作,即使你不知道还有多长时间。

1
一个不是即时但几乎是的速度测量(最近5秒?)非常有用,可以告诉我们是否进展顺利。我说不是即时,因为我曾经多次看到估计的下载速度在Tera / Petabyte每秒的范围内 :) - Agos
该事物的目的主要是改善向用户提供的信息。因此,不会通过给出过多的精度(“剩余24分钟4.2秒”)来说谎估计是准确的,也不会通过给出单个值而不是区间来表示它不会变化等。当然,如果估算器发现输入太过变化,它可以指出这一点。 - Phil H

2
改进估计时间本身:直观来说,我猜测网络连接速度是围绕着某个临时平均速度的一系列随机值 - 东西以一定的速度进行,然后突然变慢或加速。
因此,一个选择是通过某些指数对前一组速度进行加权,使得最近的值具有最强的权重。这样,随着先前的平均速度越来越远,它对当前平均速度的影响会减少。
然而,如果速度随机波动,可能值得使指数函数顶部变平(例如通过使用高斯滤波器),以避免过多的波动。
因此,总之,我想测量标准偏差(可能限制在过去的N分钟内),并使用它来生成应用于输入的高斯滤波器,然后使用标准偏差限制引用精度。
但是,您如何将标准偏差计算限制在最近的N分钟内?您怎么知道要使用多长时间?
或者,还可以利用模式识别技术来检测是否达到了稳定速度。

0

我自己也曾经考虑过这个问题。我的答案是在计算当前(以及未来)传输速率时保守一些,并且包括对更长时间段进行平均,以获得更稳定的估计值。也许可以低通滤波显示的时间,以避免在2分钟和2天之间出现跳跃。

我认为置信区间并没有什么帮助。大多数人无法理解它,而且它只会显示更多的猜测内容。


我认为一个简单的置信度指示会很有效,比如“20-25分钟”。至少限制提供值的精度也是值得的——使用“大约2小时”而不是“2小时16分钟”。 - Phil H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接