8

彼らは言うことができました

このxckd 漫画に触発されて、ファイルのコピー/移動の見積もりをユーザーに提供するための最良のメカニズムは何だろうか?

xkcd の alt タグは次のようになります。

彼らは「接続が失われた可能性が高い」と言うかもしれませんが、1,163 時間待っていれば最終的に終了するという期待を与えるために単純な時間平均を行う方が楽しいです。

面白いことは無視して、それは本当に Windows で行われていることですか? 他のOSはどうですか?より良い方法はありますか?

4

8 に答える 8

3

Windows エクスプローラーでの残り時間の推定方法に関する同様の質問(およびそこにある他の回答) に対する私の回答をご覧ください。

私の意見では、適切な見積もりを取得する方法は 1 つしかありません。

  • コピー プロセスを開始する前に、コピーする正確なバイト数を計算します。
  • 現在の転送速度に基づいて、定期的に (1、5、または 10 秒ごと、YMMV) 見積もりを再計算します
  • ネットワーク上でコピーしている場合、現在の転送速度は大きく変動する可能性があるため、たとえば、最後の見積もり以降に転送されたバイト数に基づいて平均を使用してください。

多くのファイルをコピーする場合は、最初のポイントでかなりの作業が必要になる場合があることに注意してください。それがおそらく、マイクロソフトの人たちがそれなしで行くことにした理由です. その計算によって作成される追加のオーバーヘッドが、ユーザーにより良い見積もりを提供する価値があるかどうかを判断する必要があります。

于 2009-07-20T08:38:18.500 に答える
2

アイテムがキューに入れられるよりも早くキューから取り出されることを考えると、キューが空になる時期を見積もるために似たようなことをしました。(時間、キュー サイズ) の最新の N 個の読み取り値に対して線形回帰を使用しました。

これにより、素朴な方法よりも優れた結果が得られます

(bytes_copied_so_far / elapsed_time) * bytes_left_to_copy
于 2009-07-20T08:15:36.863 に答える
1
  • たとえば、1000ミリ秒ごとに起動するグローバルタイマーを開始し、合計経過時間カウンターを更新します。elapsedTimeこの変数を「 」と呼びましょう
  • ファイルのコピー中に、すでにコピーされた量でローカル変数を更新します。totalCopiedこの変数を「 」と呼びましょう
  • 定期的に発生するタイマーイベントで、を除算totalCopiedtotalElapsedて、タイマー間隔ごとにコピーされるバイト数(この場合は1000ms)を求めます。bytesPerSecこの変数を「 」と呼びましょう
  • 合計ファイルサイズをで割り、bytesPerSecこのファイルをコピーするために理論的に必要な合計秒数を取得します。この変数を呼びましょうremainingTime
  • elapsedTimeから差し引くremainingTimeと、ファイルのコピー時間の計算がある程度正確になります。
于 2009-07-20T08:27:32.657 に答える
1

ダイアログはその制限を認めるべきだと思います。有用な時間の見積もりを出すことができないので迷惑ではありません。明らかにナンセンスな見積もりを正式に提供しているので迷惑です。

したがって、現在のレートまたはこれまでの平均レート、外れ値を破棄する移動平均などに基づいて、好きなように見積もります。操作とそれを遅らせるイベントの一般的な期間に依存するため、ファイルコピーにネットワークドライブが含まれていることがわかっている場合は、アルゴリズムが異なる可能性があります。ただし、見積もりが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
于 2009-07-20T11:34:36.633 に答える
0

ネットワーク ファイル コピーについて言えば、転送するファイル サイズ、ネットワーク応答などを計算するのが最善の方法です。私がかつて使用したアプローチは次のとおりです。

接続速度 = ping を実行し、15 KB のパッケージの往復時間を計算します。

ファイルサイズを取得し、理論的には、接続速度を使用して 15 kb パッケージに分割すると、どれくらいの時間がかかるかを確認してください。

転送が開始された後に接続速度を再計算し、費やされる時間を調整します。

于 2009-07-20T08:14:44.400 に答える
0

何よりも、秒を表示することはありません (時間と分のみ)。そこに座って、タイマーが 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 分ごと (アプリケーションによって異なります) にチェックする自動チェック機能が必要です。

于 2009-07-20T08:13:58.597 に答える