有哪些好方法可以预测长期过程的完成时间?

时间:2011-10-06 07:09:18

标签: algorithm language-agnostic time prediction file-copying

tl; dr:我想预测文件复制完成情况。考虑到开始时间和当前进度,有哪些好的方法?

首先,我知道这根本不是一个简单的问题,预测未来很难做好。对于上下文,我试图预测长文件副本的完成。

当前方法:

目前,我正在使用一个我自己提出的相当天真的公式:( ETC代表预计完成时间)

ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone

这是基于这样的假设:要复制的剩余文件将以迄今为止的平均复制速度进行,这可能是也可能不是一个现实的假设(在这里处理磁带存档)。

  • PRO:随着流程接近完成,ETC会逐渐变化,变得越来越准确。
  • CON:它对意外事件反应不佳,例如文件副本卡住或快速加速。

另一个想法:

我的下一个想法是记录最后 n 秒(或分钟,因为这些档案应该花费数小时)的进度记录,并且只需执行以下操作: / p>

ETC = currTime + currAvg * (totalSize - sizeDone)

这与第一种方法相反:

  • PRO:如果速度快速变化,ETC将快速更新以反映当前的事态。
  • CON:如果速度不一致,ETC可能会大量跳转。

最后

我想起了我在大学所做的控制工程科目,其目标主要是试图让系统对突然变化做出快速反应,但不是不稳定和疯狂。

话虽如此,我能想到的另一个选择是计算上述两者的平均值,也许是通过某种加权:

  • 如果副本具有相当一致的长期平均速度,即使它在本地跳过一点,也会对第一种方法加权。
  • 如果复制速度不可预测,则对第二种方法加权,并且很可能会长时间加速/减速,或者长时间停止。

我真正要求的是:

  • 我给出的两种替代方法。
  • 如果以及如何组合几种不同的方法来进行最终预测。

4 个答案:

答案 0 :(得分:8)

如果您认为预测的准确性很重要,那么建立预测模型的方法如下:

  1. 收集一些真实世界的测量值;
  2. 将它们分成三个不相交的集合: training validation test ;
  3. 提出了一些预测模型(你已经有两个加上混合)并使用 training 设置它们;
  4. 检查验证集上的模型的预测性能,并选择性能最佳的模型;
  5. 使用 test 设置来评估所选模型的样本外预测误差。
  6. 我猜测你当前模型的linear combination和“最后 n 秒的平均值”对于手头的问题表现得非常好。线性组合的最佳权重可以使用linear regressionR中的单行)进行拟合。

    Hastie,Tibshirani和Friedman正在研究统计学习方法的优秀资源The Elements of Statistical Learning。我不能高度推荐这本书。

    最后,您的第二个想法(平均超过最后 n 秒)会尝试测量瞬时速度。一种更强大的技术可能是使用Kalman filter,其目的正是如此:

      

    其目的是使用随时间观察的测量值,包含   噪音(随机变化)和其他不准确性,并产生价值   这往往更接近测量的真实值和   它们的相关计算值。

    使用卡尔曼滤波器而不是固定的 n - 第二滑动窗口的主要优点是它具有自适应性:当测量值大幅度跳跃时,它将自动使用更长的平均窗口。恢复稳定。

答案 1 :(得分:4)

Imho,ETC的不良实现被大量过度使用,这让我们have a good laugh。有时,显示事实而不是估计可能更好,例如:

  • 已复制了10个文件中的5个
  • 已复制了200 MB中的10个

或显示事实估算,并明确表示它只是一种估算。但我不会只显示估计值。

每个用户都知道ETC通常完全没有意义,然后很难区分有意义的ETC和无意义的ETC,特别是对于没有经验的用户。

答案 2 :(得分:3)

我已经实施了两种不同的解决方案来解决这个问题:

  1. 启动时当前传输的ETC基于历史速度值。每次转移后都会对此值进行细化。在转移过程中,我计算了历史数据和当前转移数据之间的加权平均值,这样越接近结束时,转移的实际数据的权重就越大。

  2. 不显示单个ETC,而是显示一段时间。我们的想法是从最后'n'秒或分钟计算ETC(就像你的第二个想法)。我会跟踪最佳和最差情况平均值并计算一系列可能的ETC。这在GUI中显示有点令人困惑,但可以在命令行应用程序中显示。

答案 3 :(得分:3)

这里有两件事需要考虑:

  • 确切估算
  • 如何向用户展示

<强> 1。估计

除了统计方法之外,在消除一些噪声或峰值的同时,一种简单的方法可以很好地估计当前速度,这是采用加权方法。

你已经尝试过滑动窗口,这里的想法是采用一个相当大的滑动窗口,而不是简单的平均值,给予更多近期测量的权重,因为它们更能指示进化(有点像衍生物。)

示例:假设您有10个以前的窗口(最近的x0,最近的x9),那么您可以计算速度:

Speed = (10 * x0 + 9 * x1 + 8 * x2 + ... + x9) / (10 * window-time) / 55

如果你对可能的速度有一个很好的评估,那么你就可以获得一个好的估计时间。

<强> 2。在演示文稿

这里要记住的主要事情是你需要一个很好的用户体验,而不是一个科学的前沿。

研究表明,用户对减速的反应非常糟糕,而且加速反应非常积极。因此,一开始就应该保持良好的进度条/估计时间(保留可能的减速时间)。

获得这个的一个简单方法是使用一个百分比来完成,用于调整估计的剩余时间。例如:

real-completion = 0.4
presented-completion = real-completion * factor(real-completion)

其中factorfactor([0..1]) = [0..1]factor(x) <= xfactor(1) = 1的地方。例如,立方函数在完成时间内产生很好的加速。其他函数可以使用指数形式1 - e^x等......