このxckd 漫画に触発されて、ファイルのコピー/移動の見積もりをユーザーに提供するための最良のメカニズムは何だろうか?
xkcd の alt タグは次のようになります。
彼らは「接続が失われた可能性が高い」と言うかもしれませんが、1,163 時間待っていれば最終的に終了するという期待を与えるために単純な時間平均を行う方が楽しいです。
面白いことは無視して、それは本当に Windows で行われていることですか? 他のOSはどうですか?より良い方法はありますか?
このxckd 漫画に触発されて、ファイルのコピー/移動の見積もりをユーザーに提供するための最良のメカニズムは何だろうか?
xkcd の alt タグは次のようになります。
彼らは「接続が失われた可能性が高い」と言うかもしれませんが、1,163 時間待っていれば最終的に終了するという期待を与えるために単純な時間平均を行う方が楽しいです。
面白いことは無視して、それは本当に Windows で行われていることですか? 他のOSはどうですか?より良い方法はありますか?
Windows エクスプローラーでの残り時間の推定方法に関する同様の質問(およびそこにある他の回答) に対する私の回答をご覧ください。
私の意見では、適切な見積もりを取得する方法は 1 つしかありません。
多くのファイルをコピーする場合は、最初のポイントでかなりの作業が必要になる場合があることに注意してください。それがおそらく、マイクロソフトの人たちがそれなしで行くことにした理由です. その計算によって作成される追加のオーバーヘッドが、ユーザーにより良い見積もりを提供する価値があるかどうかを判断する必要があります。
アイテムがキューに入れられるよりも早くキューから取り出されることを考えると、キューが空になる時期を見積もるために似たようなことをしました。(時間、キュー サイズ) の最新の N 個の読み取り値に対して線形回帰を使用しました。
これにより、素朴な方法よりも優れた結果が得られます
(bytes_copied_so_far / elapsed_time) * bytes_left_to_copy
elapsedTime
この変数を「 」と呼びましょうtotalCopied
この変数を「 」と呼びましょうtotalCopied
しtotalElapsed
て、タイマー間隔ごとにコピーされるバイト数(この場合は1000ms)を求めます。bytesPerSec
この変数を「 」と呼びましょうbytesPerSec
このファイルをコピーするために理論的に必要な合計秒数を取得します。この変数を呼びましょうremainingTime
elapsedTime
から差し引くremainingTime
と、ファイルのコピー時間の計算がある程度正確になります。ダイアログはその制限を認めるべきだと思います。有用な時間の見積もりを出すことができないので迷惑ではありません。明らかにナンセンスな見積もりを正式に提供しているので迷惑です。
したがって、現在のレートまたはこれまでの平均レート、外れ値を破棄する移動平均などに基づいて、好きなように見積もります。操作とそれを遅らせるイベントの一般的な期間に依存するため、ファイルコピーにネットワークドライブが含まれていることがわかっている場合は、アルゴリズムが異なる可能性があります。ただし、見積もりが30秒または見積もり時間の10%のいずれか短い方の期間でかなり一貫するまでは、大幅に遅くなったときに「ああ、なんらかの停滞があるようです」と表示するか、単に無視してください。それが大幅に高速化された場合。
たとえば、接続が一時的に停止したときに1秒間隔で受信されるダイアログメッセージ:
remaining: 60 seconds // estimate is 60 seconds
remaining: 59 seconds // estimate is 59 seconds
remaining: delayed [was 59 seconds] // estimate is 12 hours
remaining: delayed [was 59 seconds] // estimate is infinity
remaining: delayed [was 59 seconds] // got data: estimate is 59 seconds
// six seconds later
remaining: 53 seconds // estimate is 53 seconds
ネットワーク ファイル コピーについて言えば、転送するファイル サイズ、ネットワーク応答などを計算するのが最善の方法です。私がかつて使用したアプローチは次のとおりです。
接続速度 = ping を実行し、15 KB のパッケージの往復時間を計算します。
ファイルサイズを取得し、理論的には、接続速度を使用して 15 kb パッケージに分割すると、どれくらいの時間がかかるかを確認してください。
転送が開始された後に接続速度を再計算し、費やされる時間を調整します。
何よりも、秒を表示することはありません (時間と分のみ)。そこに座って、タイマーが 10 秒から 20 秒の間でジャンプするのを 1 分間待つのは、本当にもどかしいと思います。そして常に次のような実際の情報を表示します: xxx/yyyy MB がコピーされました。
次のようなものも含めます。
if timeLeft > 5h --> Inform user that this might not work properly if timeLeft > 10h --> Inform user that there might be better ways to move the file if timeLeft > 24h --> Abort and check for problems
また、推定時間が大きく変動する場合はユーザーに通知します
また、それほど複雑でない場合は、プロセスがまだ生きていて適切に動作しているかどうかを 1 ~ 10 分ごと (アプリケーションによって異なります) にチェックする自動チェック機能が必要です。