【发布时间】:2011-12-02 00:56:25
【问题描述】:
tl;dr:我想预测文件复制完成。考虑到开始时间和当前进度,有什么好的方法?
首先,我知道这根本不是一个简单的问题,预测未来很难做好。对于上下文,我试图预测一个长文件复制的完成。
目前的方法:
目前,我使用的是我自己提出的一个相当幼稚的公式:(ETC 代表预计完成时间)
ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone
这是假设要复制的剩余文件将以迄今为止的平均复制速度进行复制,这可能是也可能不是现实的假设(此处处理磁带存档)。
- 专业人士:ETC 会逐渐变化,并随着流程接近完成而变得越来越准确。
- 缺点:它对意外事件反应不佳,例如文件副本卡住或加速过快。
另一个想法:
我的下一个想法是记录最后 n 秒(或几分钟,因为这些档案应该需要几个小时)的进度,然后执行以下操作:
ETC = currTime + currAvg * (totalSize - sizeDone)
这与第一种方法相反:
- PRO:如果速度变化很快,ETC 将快速更新以反映当前的事务状态。
- 缺点:如果速度不一致,ETC 可能会跳跃很多。
终于
我想起了我在大学学习的控制工程科目,其目标本质上是试图让系统对突然的变化做出快速反应,但又不会不稳定和疯狂。
话虽如此,我能想到的另一种选择是计算上述两者的平均值,也许还有某种加权:
- 如果副本具有相当一致的长期平均速度,则对第一种方法的权重更高,即使它在局部跳跃一点。
- 如果复制速度不可预测,并且可能会长时间加速/减速或完全停止长时间等操作,则更重视第二种方法。
我真正想要的是:
- 我给出的两种方法的任何替代方法。
- 如果以及如何结合几种不同的方法来获得最终预测。
【问题讨论】:
-
我做过类似的曲线拟合。但它的开销很大,并且只有在现有进度数据中没有太多噪音的情况下才有效。
-
这里有一些关于所有答案的好建议。很难选择一个“最好的”,但我想我会选择 @aix 的经验方法和有用链接的答案。
标签: algorithm language-agnostic time prediction file-copying