15

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つの代替アプローチ。
  • 最終的な予測を得るために、いくつかの異なる方法を組み合わせる場合とその方法。
4

4 に答える 4

8

予測の精度が重要であると思われる場合、予測モデルの構築に取り掛かる方法は次のとおりです。

  1. いくつかの実際の測定値を収集します。
  2. それらを3つの互いに素なセットに分割します:トレーニング検証テスト;
  3. いくつかの予測モデルを考え出し(すでに2つとミックスがあります)、トレーニングセットを使用してそれらを適合させます。
  4. 検証セットでモデルの予測パフォーマンスを確認し、最もパフォーマンスの高いモデルを選択します。
  5. テストセットを使用して、選択したモデルのサンプル外予測誤差を評価します。

現在のモデルと「過去n秒間の平均」の線形結合が、目前の問題に対してかなりうまく機能すると推測するのは危険です。線形結合の最適な重みは、線形回帰( Rのワンライナー)を使用して適合させることができます。

統計的学習方法を研究するための優れたリソースは、Hastie、Tibshirani、FriedmanによるThe Elements ofStatisticsLearningです。私はその本を十分に推薦することはできません。

最後に、2番目のアイデア(過去n秒間の平均)は瞬間速度を測定しようとします。このためのより堅牢な手法は、カルマンフィルターを使用することです。その目的はまさにこれです。

その目的は、ノイズ(ランダムな変動)やその他の不正確さを含む、時間の経過とともに観測された測定値を使用し、測定値の真の値とそれに関連する計算値に近い傾向のある値を生成することです。

固定のn秒スライディングウィンドウではなくカルマンフィルターを使用する主な利点は、適応性があることです。測定値が安定しているときよりも大きくジャンプするときに、自動的に長い平均化ウィンドウを使用します。

于 2011-10-06T07:26:18.337 に答える
4

イムホ、ETCの悪い実装はひどく酷使されており、それは私たちが大笑いすることを可能にします。次のように、見積もりではなく事実を表示する方がよい場合があります。

  • 10個のファイルのうち5個がコピーされました
  • 200MBのうち10MBがコピーされました

または、事実見積もりを表示し、それが単なる見積もりであることを明確にします。ただし、見積もりの​​みを表示するわけではありません。

すべてのユーザーは、ETCが完全に無意味であることが多いことを知っています。そのため、特に経験の浅いユーザーにとって、意味のあるETCと無意味なETCを区別することは困難です。

于 2011-10-06T07:42:19.590 に答える
3

この問題に対処するために、2つの異なるソリューションを実装しました。

  1. 開始時の現在の転送のETCは、過去の速度値に基づいています。この値は、転送のたびに調整されます。転送中に、履歴データと現在の転送からのデータの間の加重平均を計算します。これにより、最後に近づくほど、転送からの実際のデータにより多くの重みが与えられます。

  2. 単一のETCを表示する代わりに、時間の範囲を表示します。アイデアは、最後の「n」秒または分からETCを計算することです(2番目のアイデアのように)。最良および最悪の場合の平均を追跡し、可能なETCの範囲を計算します。これはGUIで表示するのは少し混乱しますが、コマンドラインアプリで表示しても問題ありません。

于 2011-10-06T07:39:51.007 に答える
3

ここで考慮すべきことが2つあります。

  • 正確な見積もり
  • ユーザーに提示する方法

1.見積もりについて

統計的アプローチ以外に、ノイズやスパイクを消去しながら現在の速度を適切に推定する簡単な方法の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)

、、および。factor_ factor([0..1]) = [0..1]_ たとえば、3次関数は、完了時間に向けて優れたスピードアップを生み出します。他の関数は、指数形式などを使用できます。factor(x) <= xfactor(1) = 11 - e^x

于 2011-10-06T12:13:23.933 に答える