web-dev-qa-db-ja.com

ファイルをサムドライブに上書きするのが遅いのはなぜですか?

USBサムドライブを使用して、最も重要なデータをバックアップしています。一部のファイルの書き込みが非常に遅いことに気づき、ついにそれらの違いに気づきました。これらは上書きされているファイルです。

たとえば、あるバックアップから次のバックアップに変更されるメールボックスファイル。 1つはIN.MBXと呼ばれ、もう1つはOUT.MBXと呼ばれます

元のファイルを上書きすると、クロールするだけです。しかし、古いものを削除して、すぐに新しいものをコピーすることができます。ファイルは数百MBですが、大きなファイルをコピーする場合、フラッシュドライブは高速です。

誰かがここで同様の質問をしました なぜ上書きよりもコピーの方が速いのですか? 6年前、誰も適切な説明をしていないようです。

なぜこれなのか誰か知っていますか?毎日バックアップを行う場合、少し面倒です。

1

それは、(HDDではなく)フラッシュストレージが物理的にどのように作られているかに関係しています。
引用元 spiceworks

Flashでは、特定の物理データの場所を直接上書きすることは実際には不可能です。セルにデータが保存されていて、コントローラーがそこに新しいデータを書き込む必要があると判断した場合、最初にセルを消去する必要があります。その後、その場所で新しい書き込み操作を実行できます。 ERASEとWRITEは、フラッシュでは電気的に異なる操作です。保存された特定のデータを「上書き」するために、ERASEとWRITEを連続して実行する必要がある場合、ユーザーが経験する実効書き込み速度が大幅に低下します。

これは、フラッシュドライブが物理的にどのように作成されるかと関係があります。 ERASEとは、そのブロックのすべてのセル(=ビット)を1に設定することを意味します。これには高エネルギー(つまり、高電圧)が必要であり、低速です。書き込みとは、一部のビットを0に設定することを意味します。これには、より低いエネルギー(より低い電圧)が必要であり、より高速です。 (正確なテクノロジーに応じて、「0」と「1」を逆にすることができます)。

これが、実際には未使用の場所に新しいデータを書き込む主な理由です。ウェアレベリングは重要ですが、ERASE操作とWRITE操作のこの違いが支配的です。

引用の時点で、特定のフラッシュドライブのコントローラーが十分に最適化されていないようです。通常、フラッシュドライブはファイルテーブルの古いエントリを削除し、新しいファイルを別の場所に書き込みます。次に、ドライブがアイドル状態のとき、古いデータのある領域はERASEDにリセットされます=すべてのビットは1です。

ただし、使用可能な空き領域が十分にない場合、このような動作は変わる可能性があります。その場合、コントローラーが最初にDELETE、次にERASE、次にWRITEを実行する必要がある可能性があります。これはファイルごとに行われるため、ユーザーとして最初にこれらのファイルを消去した場合、ドライブは1つの大きなEMPTY操作を実行できます。これは、DELETE、ERASE、およびWRITE操作を切り替えるよりも高速です。

さらに:

flashで消去できる最小単位は、BLOCKと呼ばれます(ファイルシステムレベルの論理ブロックと混同しないでください)。フラッシュブロックは通常256ページまたは512ページで構成されるため、フラッシュブロックは最大8MBになる可能性があります。
16kBの書き込みサイズと8MBの消去サイズのこの違いは、ホストからの新しい書き込みのためにNANDページを解放するために、ストレージデバイスファームウェアがNANDブロックの消去を開始するときにジャグリングを行う必要があることを意味しますコンピューター。このプロセスは、ガベージコレクションと呼ばれます。したがって、ファイルを削除または変更すると、オペレーティングシステムは、対応する論理ブロックのセットを無効としてマークします。この一連のイベントは、最終的に古いデータが消去され、取り返しのつかないものになります。

何ができますか?
a)長いERASEサイクルを回避するために、より多くのスペースを備えたUSBドライブを購入する
b)または、ドライブがすでに十分に大きい場合は、「上書き」コマンドのアルゴリズムが優れている可能性のある別の製造元を試してください(例:overwrite = delete&write at different location)
c)小型の外付けSSDを購入すると、はるかに高速になります。

数ヶ月前に読んだ包括的な記事を見つけて、参照として追加しようと思います

1
1NN
  1. USBインターフェースは遅いです。 USB 3.0(青)はUSB 3.1(赤)よりも遅く、USB 2(黒)はさらに遅いです。

  2. フラッシュドライブには、ソリッドステートドライブ(SSD)と同じ種類のICはありません。 SSDのコントローラーは、シングルチップフラッシュドライブよりもはるかに高速にマルチチップドライブを実行します。

  3. 新しいファイルの書き込みは、上書きよりもわずかに高速です。すべてのブロックが書き込まれた後、ファイルアロケーションテーブルが更新され、ファイルの元のバージョンで使用されていたスペースが再利用されることが示されます。ただし、これはワークロードのわずかな増加にすぎません。

プロセスは、私の学んだ同僚のジェイク・グールドが説明したものとは異なりますが、1NNは頭に釘を打ちました。フラッシュメモリを使用すると、以前に使用したブロックを上書きしません。代わりに、新しいファイルが書き込まれ、以前のバージョンがFATで空としてマークされます。

0
K7AAY

質問へのリンクの回答が言っているように、それを上書きしたい場合は、単にデータを置き換えることはできません。

紙に鉛筆で書くときと同じように、一度書いたら見栄えが悪いので上書きできません。だからあなたはそれを消さなければなりません。

それはブロック/セクターの事実によって悪化します。ブロックを上書きするたびに、ブロックを消去してから書き込む必要があります。

「消去は書き込みよりも遅いです。」 - David Schwartz

[000000000000000000000000000000000000000000000000]は、各ブロックが48バイトを保持するブロックです。 Thoeretical USBには5つのブロックがあり、240Bのストレージがあります。消去速度と書き込み速度は1バイト/秒で同じです。

'foo'というテキストファイルを作成します。最初のブロックに書き込まれます。

前:

[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]

後:

[010001100100111101001111000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]

したがって、1つのブロックが変更/書き込みされました。ここで、上書きする必要があり、コンテンツが「バー」の場合。最初にそれを消去する必要があります。 (あなたがゼロをゼロにするかどうかはわかりません)。

電流:

[010001100100111101001111000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]

ゼロ化:

[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]

消去:

[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]
[111111111111111111111111111111111111111111111111]

書き込み:

[010000100100000101010010000000000000000000000000]
[000000000000000000000000000000000000000000000000] 
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]
[000000000000000000000000000000000000000000000000]

ご覧のとおり、上書きにはさらに多くの操作があります。削除すると、ファイルポインタを削除するだけで、生データとして存在します。次に、単に消去してから書き込みます。

0
Phoenix