tl; dr:ファイルコピーの完了を予測したい。開始時間と現在の進捗状況を考えると、良い方法は何ですか?
第一に、これは決して単純な問題ではなく、将来を予測することは難しいことを認識しています。コンテキストとして、私は長いファイルのコピーの完了を予測しようとしています。
現在のアプローチ:
現在、私は自分で思いついたかなり素朴な式を使用しています:(ETCはEstimated Time of Completionの略です)
ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone
これは、コピーされる残りのファイルがこれまでの平均コピー速度で実行されるという前提で機能します。これは現実的な前提である場合とそうでない場合があります(ここでテープアーカイブを処理します)。
- PRO: ETCは徐々に変化し、プロセスが完了に近づくにつれてますます正確になります。
- CON:ファイルコピーがスタックしたり、高速化するなどの予期しないイベントにはうまく反応しません。
別のアイデア:
私が持っていた次のアイデアは、過去n秒間(または、これらのアーカイブに数時間かかると想定される場合は数分)の進行状況を記録し、次のようなことを行うことでした。
ETC = currTime + currAvg * (totalSize - sizeDone)
これは、次の点で最初の方法の反対のようなものです。
- PRO:速度が急速に変化する場合、ETCは現在の状況を反映するように迅速に更新されます。
- CON:速度に一貫性がない場合、ETCは大きくジャンプする可能性があります。
ついに
私がuniで行った制御工学の科目を思い出します。その目的は、基本的に、突然の変化にすばやく反応するが、不安定で狂気ではないシステムを取得しようとすることです。
そうは言っても、私が考えることができる他のオプションは、おそらく何らかの重み付けを使用して、上記の両方の平均を計算することです。
- コピーがローカルで少しジャンプしている場合でも、コピーの長期平均速度がかなり一貫している場合は、最初の方法の重みを大きくします。
- コピー速度が予測できない場合は、2番目の方法の重みを大きくし、長時間の速度の増減、または長期間の完全な停止などを実行する可能性があります。
私が本当に求めているのは:
- 私が与えた2つの代替アプローチ。
- 最終的な予測を得るために、いくつかの異なる方法を組み合わせる場合とその方法。