3

ハードドライブに一連の文字の非常に大きなデータファイルがあると仮定しましょう。

ABRDZ...。

私の質問は次のとおりです。ヘッドがファイルの先頭に配置され、1000の位置間隔ごとに5文字が必要な場合は、シークを実行するか(どこを見ればよいかがわかっているため)、単に大きなバッファーを使用する方がよいでしょう。順番に読み取り、メモリ内でジョブを実行します。

素朴に私は、「A」を読んでから「V」を読み込もうとする方が、たとえば位置200(「V」の位置)まですべてのファイルを読むよりも速いと答えたでしょう。最小のI/Oは512バイトなので、これは単なる例です。

編集:私の以前の自己素朴な答えは、次の場合によって部分的に正当化されます:100Gbファイルが与えられた場合、最初と最後の文字が必要です。ここで私は明らかにシークをします....そうですか?

シークの「長さ」と取得するデータの量の間にはトレードオフがあるのではないでしょうか。

誰かが私にこれを明確にすることができますか?

4

1 に答える 1

0

[更新] 通常、1000ごとに5つの元の数値から(5バイトは1000の一部であると想定するため、ステップ数は1000になります)、ステップ数が私の元のブロックサイズの2倍未満の場合答えはかなり良い説明です。HDブロックサイズの2倍を超えると、少し注意が必要になります。その時点では、未使用の過去を探すことでスピードを上げることができるため、読み取り時間を簡単に浪費することになります。 )HDブロック。

[元の] まあ、これは非常に興味深い質問です。私が信じているのは、同じように興味深い答えです(これもやや複雑です)。実際、これは、ドライブ(またはソフトウェアが実行されるドライブ)に実装したブロックサイズの大きさなど、他のいくつかの質問に帰着すると思います。ブロックサイズが4KBの場合、ハードドライブが一度に取得できる(真の)最小値は4096バイトです。あなたの場合、本当に1000ごとに5文字が必要な場合、すべてのディスクIOでこれを行った場合、基本的に同じブロックを4回再読み取りし、その間に3回のシークを実行します(実際には効率的ではありません)。

私の個人的な信念は、コードを(ドライブ効率を高めたい場合は)使用しているドライブのブロックサイズを理解し、そのサイズ番号を使用して一度に何バイトかを知ることができるということです。 RAMに持ち込む必要があります。このようにすると、巨大なRAMバッファーを用意する必要はありませんが、同時に実際にシークする必要はなく、余分な読み取りを無駄にする(または実行する)こともありません。

これが最も効率的です。私はそれが最も効率的だとは思いませんが、あなたが必要とするパフォーマンスには十分かもしれません。読み取りヘッドが目的の場所にある場合でも、ファイル全体を一度に読み取るのではなく、各ブロックの読み取りの途中でアルゴリズム作業を実行すると、待機する時間が失われると思います。ドライブプラッターの次の回転。一方、一度にすべてを読み取る場合、ドライブはファイルのすべての部分の順次読み取りを一度に実行できる必要があります。ただし、ファイルが本当に1ブロックを超えているかのように、回転ドライブでは、次のブロックに到達するためだけにランダムシークを実行する必要があるため、ドライブが最適化されていない場合に問題が発生する可能性があります。

申し訳ありませんが、長い間答えてくれましたが、いつものように、あなたの場合は簡単な答えはありません。

ファイル全体を一度に読み取るだけで、全体的なパフォーマンスが向上する可能性があると思います。各システムはドライブ設定などの本質的に異なるパラメータを持っているので、これを保証する方法はありません...

于 2012-06-11T15:55:20.520 に答える