大きなファイルをローカル ディスクに書き込みたい。大きなファイルを多くの小さなファイルに分割し、ディスクに書き込もうとしました。しかし、ファイルを分割して書き込もうとすると、ディスクの書き込み時間が大幅に増加することに気付きました。
また、ディスクからファイルをコピーして、別のコンピューターのディスク (レデューサー) に書き込みます。読書時間も大幅に増加したことがわかりました。誰か私に理由を説明できますか?私はhadoopで作業しています。
ありがとう!
これは、基盤となるファイル システムとハードウェアによるものです。
たとえば、NTFS (Windows の場合) の MFT など、ファイルの内容に加えて、各ファイルのオーバーヘッドがあります。そのため、単一の大きなファイルの場合、ファイル システムはより少ない簿記を行うことができます。したがって、より高速になります。
お使いの OS によって調整されるため、単一の大きなファイルは可能な限りハード ドライブの連続したセクターに書き込まれる傾向がありますが、複数の小さなファイルはそのように書き込まれる場合と書き込まれない場合があります。したがって、シーク時間の増加は、多くの小さなファイルの読み取り時間の増加を説明する可能性があります。
OS の効率も大きな役割を果たす場合があります。たとえば、ファイルの内容をプリフェッチするかどうか、バッファーをどのように使用するかなどです。多くの小さなファイルの場合、OS がバッファーを効率的に使用する (および他の問題に対処する) ことはより困難です (シナリオによっては、動作が異なる場合があります)。
編集:あなたが言及したコピープロセスに関しては、通常、OSは次の手順でそれを行います:
ディスクからデータを読み取る -> バッファにデータを書き込む -> バッファから読み取る -> (別の) ディスクに書き込む
これは通常、複数のスレッドで行われます。多数の小さなファイルを処理する場合、OS はこれらのスレッドを効率的に調整できない場合があります (非常にビジーなスレッドもあれば、待機しなければならないスレッドもあります)。単一の大きなファイルの場合、OS はこれらの問題に対処する必要はありません。
すべてのファイル システムには、page という名前のデータを格納するために定義された最小単位 (共有不可) があります。たとえば、ファイル システムのページ サイズが 4KB だとします。8 KB の大きなファイルを保存すると、ディスク上の 2 ページが消費されます。ただし、ファイルをそれぞれ 2KB のサイズの 4 つのファイルに分割すると、16KB のディスク領域を消費するディスク上の 4 つの半分満たされたページが消費されます。
同様に、ファイルをそれぞれサイズが 1KB の 8 つの小さなファイルに分割すると、ディスクの 8 ページが部分的に使用され、32KB のディスク領域が消費されます。
読み取りオーバーヘッドについても同様です。ファイルが複数のページの場合、散らばっている可能性があります。これにより、シーク時間/アクセス時間のオーバーヘッドが高くなります。