Windowsのコピーダイアログ(Windows XPの場合)は最初にコピーをメモリに保存し、ダイアログを閉じた後もまだコピーしているので、時間が空いているのはわかっていますが、コピーを作成するのにかかる時間の見積もりはなぜですかメモリのコピーが無効になっている場合でも(VistaおよびWindows 7の場合)、それほど不正確ですか?それはとても恣意的です!コピー手順全体はどのように機能し、Windowsはそれを正しく推定できないのですか?
要するに、貧弱なアルゴリズムとびくびく推定は、実際には実装の弱点です。
TeraCopy のような他のツールはより良い仕事をします。なぜ実装が良くないのか説明する価値はないと思います。彼らはそれに気づき、改善するでしょう。
難しいこと:
これには、バイト数だけでなく、作成するファイルの量も関係します。 100万の1KBファイルまたは1000の1MBファイルがある場合、前者には多くのファイルを作成するオーバーヘッドがあるため、状況はまったく異なります。使用するファイルシステムによっては、実際にデータを転送するよりも時間がかかる場合があります。
このダイアログは、私をかなり何度も怒らせました:
最新のWindowsコピーのものはそれほど良くありません。
Raymond Chenがこれについて非常に素晴らしい記事を書いたことがあります。基本的に、ダイアログは推測しているだけです:)。
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/06/47937.aspx
「コピーダイアログは単に推測しているだけなので、将来を予測することはできませんが、試行することを余儀なくされます。そして、コピーの非常に最初の段階で、経過する履歴がほとんどない場合、予測は非常に悪い場合があります。
これが類推です:誰かが「私は100まで数えるつもりです、そしてあなたは私がいつ完了するかについて継続的な見積もりを与える必要がある」とあなたに言ったとしましょう。 「1、2、3 ...」から始まります。あなたは彼らが毎秒約1つの数字で進んでいることに気づくので、あなたは100秒と推定します。ええと、今、彼らは減速しています。 「4 ... ... ... 5 ... ... ...」次に、見積もりをおそらく200秒に変更する必要があります。今、彼らはスピードアップします: "six-seven-eight-nine"あなたはあなたの見積もりを再び更新しなければなりません。
カウントしている人ではなく、あなたの見積もりだけを聞いている誰かが、あなたがあなたのロッカーから外れていると考えています。見積もりは100秒から200秒から50秒になりました。あなたの問題は何ですか?なぜあなたは良い見積もりを出すことができないのですか?
ファイルのコピーも同じです。シェルは、コピーされるファイルの数とバイト数を認識していますが、ハードドライブ、ネットワーク、またはインターネットの速度を認識していないため、推測する必要があります。コピーのスループットが変化した場合、新しい転送速度を考慮するために推定値を変更する必要があります。」
私は10まで数えるつもりです、1....2....3....4
10になるまでにいくつのドットが必要ですか?
5.6.7
今はどう?数値間の過去のすべてのドットを考慮に入れてそれを平均化しますか?最後の4つの間隔のみを取り、その平均を使用しますか?最後の間隔のみを見ますか?
ファイル転送でも同じ問題があります。ファイルの転送速度は一定ではなく、多くの要因に基づいて高速化および低速化します。数値が大きく変動する理由は、Microsoftがスペクトルの「最後のインターバルのみをカウントする」側に傾いているためです。
スペクトルのその側には何も問題はありません。これにより、より正確な「1秒あたりの秒数」が得られます(リアルタイムで1秒すると、カウンターが1秒ずつ下がります)。これにより、タイマーの合計ETAが大きく変動します。 。
反対側の良い例は、圧縮時の 7-Zip です。処理中に圧縮速度が低下した場合、ETAはファイル転送ETAのように劇的にジャンプしないことがわかりますが、タイマーが1秒ダウンするまでに2〜3実秒かかる場合があります(またはカウントアップが開始される場合もあります) )新しい速度で安定するまで。
実際には、WAAAAAYからの MicrosoftのRaymond Chenによるほぼ標準的な回答 があり、パズルにはいくつかのピースがあります。
なぜなら、コピーダイアログは単に推測しているだけだからです。将来を予測することはできませんが、試さざるを得ません。そして、コピーの最初の段階で、経歴がほとんどない場合、予測は非常に悪くなる可能性があります。
まず、Windowsが推測していることです。ファイルの数とサイズを認識していますが、ファイルごとの転送速度は非常に変動します。サイズやドライブ上の場所などによって異なります。時が経つにつれ、現在と過去の状況に基づいて推測が調整されるため、実際の状況では転送速度の見積もりが不正確になります。
Microsoftの主なソフトウェア設計エンジニアである Raymond Chen による 説明 は次のとおりです。
なぜコピーダイアログはそのような恐ろしい見積もりを出すのですか?
なぜなら、コピーダイアログは単に推測しているだけだからです。将来を予測することはできませんが、試さざるを得ません。そして、コピーの最初の段階で、経歴がほとんどない場合、予測は非常に悪くなる可能性があります。
これが類推です:誰かが「私は100まで数えるつもりです、そしてあなたは私がいつ完了するかについて継続的な見積もりを与える必要がある」とあなたに言ったとしましょう。 「1、2、3 ...」から始まります。あなたは彼らが毎秒約1つの数字で進んでいることに気づくので、あなたは100秒と推定します。ええと、今、彼らは減速しています。 「4 ... ... ... 5 ... ... ...」次に、見積もりをおそらく200秒に変更する必要があります。今、彼らはスピードアップします: "six-seven-eight-nine"あなたはあなたの見積もりを再び更新しなければなりません。
上記の ブログ投稿 で引用されているこの問題については、いくつか興味深いコメントがあり、長い議論があります。
レイモンドチェンは伝説的な人物、「マイクロソフトのチャックノリス」です。もっと権威のある答えが得られるとは思いません。彼は少なくとも問題のコードを見たと思います。
明らかな理由は、転送の速度は時間とともに変化し、平均も変化し、予測も変化するためです。これを技術系ではない友人に説明するために、私は飛行機による旅行を含む類推を使用しました。大西洋の上空を飛行します。タクシーで出発空港に到着すると、到着予定時刻は約2か月です。到着空港に降りると、それまでの平均速度に基づいて、5秒で友達の家に到着します。
ただし、同じディスク内または2つのローカルディスク間でファイルをコピーするなど、予測可能なシナリオのように見えても、実際に速度がどれだけ変化するかを理解する必要があります。私がWindows 8で気に入っている新機能の1つは、[詳細]をクリックすると、時間の経過に伴う速度をグラフ化する機能です。 Windows 8マシンにアクセスできない場合は、画像で Windows 8コピーダイアログ を検索して、多くの例を確認してください。それらの多くはかなり平らですが、それらの多くはまた、ハードドライブがゼロに落ちたときに、ハードドライブが実際に正常であるかどうか疑問に思うほど、不穏なでこぼこです。
これらのバンプの一部は、ファイルサイズのばらつきが原因である可能性があります。フィールドが小さいほどアクセスが多くなり、特に読み取りヘッドを移動してシークする必要がある機械的なハードドライブでは遅くなりますが、一部のドライブは安価なドライブである可能性がありますプラッターへの損傷を防ぐために、わずかなタッチでストールします。
ETA予測アルゴリズムには良いものと悪いものがありますが、正確な予測のためには、コンピューターはすべてを知っている必要があります。アルゴリズムを「スマート」にしようとするリスクは、アルゴリズムがさらに面白く間違っている、予期しない新しいケースを作成する可能性があることです。
ファイルのセットを圧縮するのにかかる時間を知る唯一の方法は、それらを圧縮することです。 Windowsの最善の推測が近い場合もあれば、極端に間違っている場合もあります。お気づきのことと思いますが、多数のファイルをコピーする場合も同様です。
これは、あまり正確ではない情報が無用に表示されるほどのバグではありません。それを修正する最良の方法は、目を閉じることです。それを無視します。 ;-)
おそらく、ファイルをコピー/圧縮し、終了時にアラーム音を鳴らすことができるプログラムがあるでしょう。それは本当に便利でしょう。 Windowsがハウスクリーニングを完了するのを待つ間、少し昼寝をすることができました。
その理由は、Roaldの回答によってリンクされた ブログ投稿 のコメントの1つでうまく説明されたと思います。
それは恐ろしい推定アルゴリズムを持っています。言い訳はありません。 1000の1KBファイルと10の1MBファイルをコピーする必要がある場合、1KBファイルと同じように1MBファイルでもビジー状態になると考えられます。
それがそのような恐ろしい見積もりを与える理由は、それがうまく行われていないためです。明らかに100%の正確さはあり得ませんが、はるかに優れている可能性があります。
コピープロセスを迅速化するために(コピー関連の操作を実行する代わりに時間の計算に時間をかけすぎないように)、エクスプローラーに組み込まれたWindowsコピーユーティリティは、以前の書き込み操作が完了した速度に関する限られた量の情報を保持します。残りの時間を計算する必要があるたびに、書き込み操作にかかった平均時間を計算し、残りの書き込み操作の数を乗算します。
問題は、書き込み操作の実行にかかる時間が一定ではないことです。実際には大幅に異なる可能性があります。したがって、これは時間の見積もりに大きな変化をもたらします。
一般的な考えに反して、彼らは私たちの手を投げるほど難しくはありません。
ほとんどの人がブログを書いている理由、そしてここにいる人々がその可能性に気付いていない理由は、研究分野と学校の幅の広さから、私が知ることができる限り最高です。 [ブログのライターよりも最近のトレーニングを受けた卒業生] [数十億ドル規模の会社]マイクロソフトにとって、控えめでありながら非常に快適な救済策が可能であるべきです。
その理由を大まかに説明してみます。
1。 確実に予測できません将来IOカーネルの範囲外の状況によるロード
2。 は、有用な詳細レベルでIO heuristicsを追跡しません。Utilizationははるかに広いディスク/ネットワークの読み取り/書き込み速度よりもコンセプト。
これについて行う必要があることはほとんどなく、最も基本的なIO使用法の情報を追跡するだけです。
。 彼らは追跡されていた、ヒューリスティックスを使用しなかったでしょう
ここで、a、b、cにはそれぞれ3つの状態があります。ファイルマネージャーはコピーする前にファイル(またはメタデータのみ)を調べ、F *(b x c)+ dは高価な計算ではありません。より正確なものが必要な場合は、より多くの状態を持つルックアップテーブルを使用します。計算はほとんどありません。
注:ここの寸法はプラッターのものであり、SSDとは異なります-開始/中間/終了は問題ではありません
私が説明したものとこれまでに見た以前の実装との主な違いは、要するに、ディスク上のファイルサイズとファイルの分散/エントロピーを観察し、それを使用して[より]正確に説明することですディスク使用量の時間要素。
(特許は読者のための演習として残されています...)
考慮すべき3つの要素があります。
数値1と3は転送時間の計算に最も明白な影響を与えるようですが、非常に多くの人々が数値2を考慮していません。これは転送にかかる時間にhugeの影響を与える可能性があります、定量化するのは困難です。
基本的に、ファイルが書き込まれるたびに、ファイルシステムはファイルに関するメタデータのビットを書き込む必要があります。所有権、許可、作成/変更/アクセス時間など。特定のファイルシステムによっては、この情報は、ファイルが書き込まれている場所から「遠く」離れたディスクの一部に書き込まれる場合があります。このファイルシステムのオーバーヘッドは、一見単純に見える転送に長い時間をかけたり、時間の見積もりを大幅に変動させたりする原因となります。
例:1つの大きなファイルを転送すると、見積もりが安定してかなり正確であることがわかりますが、サイズが異なるが合計サイズは同じである何百ものファイルを転送すると、時間がかかり、見積もりに時間がかかる場合があります。
つまり、計算は現在の転送速度に基づいています。
例:転送速度が低下した場合Windowsが大量の小さなファイルをコピーする必要があるため、予想される時間が経過します大きなファイルの場合、up線形で、その逆です。
転送速度がどの程度になるかを予測することはほぼ不可能ですファイルサイズ、CPU使用率、転送エラーなどの多くの要因に依存するため、転送プロセス全体。
There is some way to refine or correct this kind of "bug"?
Roald van Doornが言ったように、それは基本的に単なる推測です。もちろん、それはそれがより良い推測ができなかったことを意味しません。これを計算するために使用できる多くのヒューリスティックがあります。
明らかにこれはどれも簡単に実装できません。私はファイルのコピーについてのみ言及しました。同様の作業は、あらゆる種類の転送で行う必要があります。
あなたが自問しなければならない質問-マイクロソフトではなく、より良い見積もりを出すために時間を費やすのでしょうか、それとも、ファイル転送をより高速にするのでしょうか。
ただし、7-Zipで何かを圧縮すると、ウィンドウよりも推測がはるかに優れていることに気付くでしょう。私はそれが複雑なことをしているのではないかと思っています。
MSDNブログの投稿には興味深い回答がいくつかありますファイル管理の基本の改善:コピー、移動、名前変更、削除についてこの。なぜそれが難しいのかについて:
多くの予測不可能な変数や制御できない変数が含まれているため、コピーを完了するまでの残り時間を正確に見積もることはほぼ不可能です。たとえば、コピージョブの期間に使用可能なネットワーク帯域幅はどれくらいですかウイルス対策ソフトウェアが起動してファイルのスキャンを開始しますか?別のアプリケーションがハードドライブにアクセスする必要がありますか?ユーザーは別のコピージョブを開始しますか?
そして、彼らがどのように改善しているか、
多くの時間を費やして、現在のものよりわずかに改善されるだけの低い信頼性の見積もりを出すのではなく、有用で説得力のある方法で確信している情報を提示することに焦点を合わせました。これにより、当社が入手できる最も信頼性の高い情報が提供されるため、より多くの情報に基づいた意思決定を行うことができます。
とはいえ、与えられた見積もりだけを本当に改善し、進行状況バーをそのままにしたい場合は、 Slashdotコメント で提案されていることを実行できます。
ファイルシステム上の各ストレージデバイスの予想速度のテーブルを維持します。ファイルシステム情報を読み取るのにかかる時間を記録します。デバイスがマウントされている場合、それがそのデバイスの種類に適している場合は、途中で速度を測定し、最後までシークします。場所全体の読み取り速度と書き込み速度の近似曲線を取得し、それらを将来の推定に使用します。将来の読み取りおよび書き込み操作のために、それらがどこにあり、どれだけ速く進むかをメモし、それに応じて曲線を調整してください。
動作が開始したら、それぞれのデバイスの入力と出力の曲線を確認します。ターゲットの場所の予想速度を見つけます。推定には、どちらか遅い方の速度を使用する必要があります。
USB HDDからメインドライブに200GBをコピーしました。約130000個のファイルがあった
最初の4〜5分後、次のことがわかりました。
最初に、ウィンドウは見積もりを1時間程度から5時間以上に変更し、その後1時間に戻しました。最終的には95%のように、それでも推定を10分から10時間以上に変更していました。そのため、より正確になる代わりに、ますます正確さが失われていました。
簡単な数学は示す:
130,0ファイル1ファイル/秒= 22分
200,0 MB 7 MB /秒= 47分
22分-サイズが数キロバイトのファイルをコピーするシーク時間で緩和されます。 47分-シーク時間がない場合に実際のデータを転送する必要がある時間。
22min + 47minの合計は、それが取る可能性のある絶対最大時間です。
したがって、見積もりは47と69分の間にあるはずです。
ダイアログで表示されるのは約90%:「1 MB /秒でいくつかの小さなファイルをコピーしています。データが20 GB増えます。完了するまでに5:30時間かかります。
数秒後:「ここで大きなファイルをコピーしています。70mb/ sでは、完了するまでに4分かかります。
同じダイアログから実際に人間が見るもの:120,000ファイルと180 GBはすでに40分間コピーされています。残りの10000ファイルと20GBには約5分かかります
ダイアログは、毎秒より正確になる計算を行うのに十分な情報を提供します。小さなファイルがコピーされる速度を知っています。大きなファイルがコピーされる速度を認識しています。また、ファイルの数と残りのバイト数も把握しています。
上限と下限を設定するだけで、非常に正確な仮定を行うのは簡単です。
ダイアログには、大きいファイルが小さいファイルの前にある場合にのみ、もう少し正確なデータが表示されます。これが当てはまる場合は、40分から始まり、30分後に小さなファイルのコピーが始まり、「さらに20分必要です」と表示されます。
しかし、最初に小さなファイルがあり、大きなファイルが最後にあるとき。ダイアログは実際には、小さなファイルを転送する「1秒あたりのファイル数」を気にしません。小さなファイルの数が無限大であるように計算され、そのようにそれらは永遠に小さくなります。