ハード ドライブからファイルを読み取る場合、通常、mmap はデータをすばやくメモリに格納するための優れた方法と見なされています。オプティカル ドライブを使用する場合、アクセスに時間がかかり、遅延が大きくなることが懸念されます。光学ドライブの待ち時間や全体的なロード時間を可能な限り隠す/排除するために、どのようなアプローチ/抽象化を使用していますか?
5 に答える
いくつかのファイル(最適には1つ)からデータの巨大なチャンクを順番に読み取ることにより、シークを最小化または排除します。
まず、最新の光学ドライブはシーケンシャルデータの読み取りが非常に高速ですが、データの検索はHDよりもはるかに遅いことを覚えておく必要があります。したがって、大きなファイル内で多くを探す必要がある場合(たとえば、500 MB以上のファイル内をランダムにジャンプする場合)、最初に500 MB全体をHDに(一時ファイルに)コピーする方が実際には高速である可能性があります。シーケンシャルで高速な読み取りを行い、一時ファイルに対して操作を実行し(HDでのアクセス時間が大幅に短縮されるため、はるかに高速になります)、終了したらファイルを再度削除します。
上記と同じことが、小さな大きなファイルと多くの小さなファイルにも当てはまります。いくつかの大きなファイルでの作業は、多くの小さなファイルでの作業よりもはるかに高速です。ある小さなファイルから別の小さなファイルに切り替えるたびに、膨大なシーク時間が再び頭痛の種になるためです。これが、オプティカルメディアで出荷される多くのゲームがゲームデータを巨大なアーカイブファイルにパックする理由です(たとえば、1つのレベルのすべてのテクスチャは、テクスチャごとに1つの小さなファイルではなく、1つの巨大なファイルにあります)。したがって、データを大きなファイルで適切に構造化してください。可能な限り順番に読むことができます。
HDキャッシング自体は優れた手法です。タイトルを忘れてしまいましたが、常に環境の3DデータをHDで保存していたゲームがあります。あなたが世界を移動している間、それは常にDVDからHDにデータをコピーしていました。したがって、周囲の3Dランドスケープは高速アクセスのために常にHDで利用可能でしたが、DVD全体がコピーされたわけではなく、HDスペースを節約するために約200〜300MBのみが一時的にHDにキャッシュされました。それについての唯一の厄介なことは、ゲームのプレイ中にDVDアクセスの「ノイズ」が頻繁に発生することでしたが、ほとんどの場合、プロセス全体はCPUアイドル時間中にのみ発生したため、ゲームプレイには実際には影響しませんでした。同じ方向で常に非常に高速に実行した場合にのみ、DVDドライブがフォールバックし、突然ゲームがロードインジケーターで数秒間停止する可能性があります。しかし、私はこのゲームを何日もプレイしていて、おそらくこの負荷インジケーターを1週間以内に3回見ました。ゆっくりと移動している場合、または常に同じ方向に移動していない場合は、負荷インジケーターはありませんでした。
使用できる実際の抽象化はありません。オプティカル ドライブには、最高のパフォーマンスを得るために最適化する必要がある非常に特殊な特性があります。
いくつかのヒント:
光学ドライブの最大のキラーはシーク時間です。可能な場合は、読み取るすべてのファイルがディスク上で連続しており、できるだけ密集していることを確認してください。シークしなければならない場合は、一方向にできるだけ頻繁にシークしないようにします。
非同期読み取りは、パフォーマンスを大幅に向上させることもできます。ファイル A、B、C を読み込んで処理する必要がある場合は、A を処理する前にファイル B の読み取りを開始し、B の処理中にファイル C を読み取る必要があります。
一般的に、一度に読めるデータが多ければ多いほど良いです。大量のデータを読み取っている間は、ディスクの理論上のスループットしか得られません。一部の OS の /drivers は、セクターをキャッシュすることによって、多数の小さなファイルを読み取るペナルティを最小限に抑えますが、そうでないものもあります。
TOC の一部のみがキャッシュされている一部のファイルシステムや OS では、exists(filename) チェックを何度も行うことも有害な場合があります。
私たちのアプリケーションでは、通常、ファイルを 1 つまたは複数の「一括」ファイルにパックし、アクセス順序に基づいて順番に並べます。一部のファイル (およびディレクトリ) は圧縮され、メモリ内で解凍される前に全体が読み取られます。これは、多数の小さなファイル (XML やスクリプトなど) を含むディレクトリがある場合に役立ちます。
基本的に、多くのベンチマークと微調整:)
遅いドライブは遅くなります。ごめん。ただし、光学ドライブのハードウェアは通常、順次読み取りを行うように最適化されているため、コードをそのように機能させることができれば、ある程度の改善が見られる可能性があります。シーケンシャルアクセスの場合、、、などの間mmap()
に大きな違いが見られるとは思えません。fread()
OSがまだ行っていない場合は、読み取りバッファサイズをドライブのブロックサイズの倍数になるように調整できる場合もあります。オプティカルドライブは、ハードドライブに比べてブロックサイズが大きくなる可能性があり、バッファが十分に大きくない場合は、代償を払っています。