3

誰かが私がハードドライブシークがどのように機能するかを理解しようとするのを手伝ってくれるでしょうか。

読み取りパフォーマンスが絶対に不可欠な小さなバイナリデータベースファイルがあります。ファイル内の数バイトをスキップする必要がある場合は、seek()またはread()を使用してから、不要なデータを破棄する方が速いです。

ハードドライブの平均シーク時間が10msで、読み取り速度が300MB / sの場合、3MB未満の値のseek()よりもread()の方が速いと計算しました。本当ですか?新しいシークを実行するときに、既存のストリームを読み取るためのオーバーヘッドはありませんか?

インデックスに適したファイル構造はどれだと思いますか。

Entry1:Value:PointerIntoToData
Entry2:Value:PointerIntoToData
Entry3:Value:PointerIntoToData
Data, Data, Data

Or

Entry1:Value:Data
Entry2:Value:Data
Entry3:Value:Data

エントリを読み取るときに値が正しくない場合、その値は無視されます。したがって、ファイルをストリーミングするときは、次の方が高速です。1.エントリが不要な場合は、seek()を使用してスキップします。2。エントリが不要な場合は、データを読み取り、データを破棄します。3.または、最初の構造を使用します。最後にデータリポジトリへのseek()を入力する必要があります。

エントリは4バイト、値は8バイト、データは12KBです。

乾杯

4

4 に答える 4

4

シークシステム コールが行うことはすべて、次の読み取りが行われるファイル内の位置を変更することです。ドライブ ヘッドは移動しません。ドライブ ヘッドはデータの読み取りまたは書き込み時に移動し、OS が次に何を行うかを直接制御することはできません。

必要のない大量のデータを読み取ると、すべての読み取りデータが OS バッファーにスペースを必要とし、古いデータが破棄されるため、影響があります。そのため、大きなファイルに対してシークを使用すると、ファイルシステムのキャッシュが混乱することが少なくなります。


以下に記述するのは、データベース全体をメモリに収めることができないことを前提としています。できれば、そうしてください。すべてを読み取り、ファイルの最後に新しいデータと変更されたデータを追加しようとします。無駄なスペースを心配する必要はありません。たまに圧縮を行ってください。


データベースが大きすぎる場合:

データはブロック (またはページ) 単位で物理ドライブに読み書きされます。同様に、OS のディスク IO の基本単位はページです。OSがディスクからデータをキャッシュする場合、それはページ全体にもあります。したがって、シークまたは読み取りを使用して数バイト先に進む必要があるかどうかを考えるのはほとんど意味がありません。高速にしたい場合は、ディスク IO が実際にどのように機能するかを考慮する必要があります。

まず、すでに nobugz で言及されている参照の場所です。各操作で使用するデータがファイル内の近くに配置されている場合、OS が読み書きする必要のあるページは少なくなります。一方、データを分散させると、多くのページを一度に読み書きする必要があり、常に遅くなります。

インデックスのデータ構造について。通常、これらはB ツリーとして編成されます。これは、メモリに格納された大量のデータをページ化された読み取りと書き込みで効果的に検索するために特別に作成されたデータ構造です。

そして、データを整理するための両方の戦略が実際に使用されています。たとえば、MS SQL Server は既定で最初の方法でデータを保存します。データは個別に保存され、インデックスにはインデックス付きの列のデータとファイル内のデータ行の物理アドレスのみが含まれます。ただし、クラスター化インデックスを定義すると、すべてのデータがこのインデックス内に格納されます。他のすべてのインデックスは、物理アドレスではなく、クラスター化されたインデックス キーを介してデータを指します。最初の方法は簡単ですが、クラスター化インデックスに基づいてデータ範囲のスキャンを頻繁に行う場合は、もう 1 つの方法がはるかに効果的です。

于 2009-03-01T21:19:18.720 に答える
3

シークアクセスはどの程度「絶対に不可欠」ですか?最適ではないソリューションでアプリケーションをテストしましたか?そのテスト中に、実際のボトルネックがどこにあるかを判断するためにベンチマークを行いましたか?そうでない場合は、結果に驚かれることでしょう。

次に、さまざまな方法を試して、実行時間を比較します。さまざまなシステム負荷の下でテストします(つまり、システムがアプリケーションを除いてアイドル状態のとき、およびシステムがビジー状態のとき)。

新しい高速ハードドライブにさまざまな内部最適化があり、作業がウィンドウから外れると、現在のハードドライブに基づく最適化が正しくなくなる可能性があることを考慮してください。

于 2009-03-01T20:21:24.617 に答える
1

シーケンシャル読み取りは、ヘッド シーク (位置シークではない) を必要とする読み取りよりも常に高速です。シーケンシャル読み取りの一般的なハード ドライブのパフォーマンスは 50 ~ 60 MB/秒で、最悪の場合は最大 0.4 MB/秒まで低下します。ドライブ ヘッドが配置されると、基本的にシリンダー内のデータを無料で取得できます。ファイル システム キャッシュは、シリンダーからセクターを事前に読み取ることにより、この利点を利用します。

ただし、ディスク シリンダー上のデータの配置を制御することはできません。また、ドライブの形状を推測することもできません。ボリュームが断片化されると、時間の経過とともにスループットが大幅に低下する可能性があることに注意してください。メモリにデータをキャッシュしてパフォーマンスを探す必要があります。その時点で、参照の局所性について心配します。

于 2009-03-01T20:25:42.267 に答える
0

いつでもファイルをメモリにマップしてから、ポインタなどを介してアクセスできます。これにより、通常、アクセスがより簡単かつ高速になります。

于 2009-03-02T02:30:18.847 に答える