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