私のプログラムは、ランダムアクセスで巨大なバイナリファイルからチャンクを読み取る必要があります。数千のエントリがある可能性のあるオフセットと長さのリストがあります。ユーザーがエントリを選択すると、プログラムはオフセットを探して長さバイトを読み取ります。
プログラムは内部でTMemoryStreamを使用して、ファイルから読み取られたチャンクを格納および処理します。データの読み取りは、次のようにTFileStreamを介して行われます。
FileStream.Position := Offset;
MemoryStream.CopyFrom(FileStream, Size);
これは正常に機能しますが、残念ながら、ファイルが大きくなるにつれて速度が低下します。ファイルサイズは数メガバイトから始まりますが、数十ギガバイトに達することがよくあります。読み取られるチャンクのサイズは約100キロバイトです。
ファイルの内容は私のプログラムによってのみ読み取られます。現時点でファイルにアクセスしているのはこのプログラムだけです。また、ファイルはローカルに保存されるため、これはネットワークの問題ではありません。
WindowsXPボックスでDelphi2007を使用しています。
このファイルアクセスを高速化するにはどうすればよいですか?
編集:
- ファイルのどの部分が読み取られているかに関係なく、大きなファイルのファイルアクセスは低速です。
- プログラムは通常、ファイルを順番に読み取りません。チャンクの順序はユーザー主導であり、予測することはできません。
- 小さなファイルから同じように大きなチャンクを読み取るよりも、大きなファイルからチャンクを読み取る方が常に遅くなります。
- 私は、ファイル全体を処理するのにかかる全体的な時間ではなく、ファイルからチャンクを読み取るためのパフォーマンスについて話しています。後者は明らかに大きなファイルの場合は時間がかかりますが、それはここでは問題ではありません。
皆さんに謝罪する必要があります。メモリマップトファイルを使用してファイルアクセスを実装した後、提案されたように、大きな違いはないことがわかりました。しかし、タイミングコードを追加した後、プログラムの速度を低下させるのはファイルアクセスではないことも判明しました。ファイルへのアクセスには、ファイルサイズに関係なく、実際にはほぼ一定の時間がかかります。ユーザーインターフェイスの一部(まだ特定していません)には、大量のデータでパフォーマンスの問題があるようで、最初にプロセスを実行したときに、どういうわけか違いを確認できませんでした。
ボトルネックを特定するのが面倒でごめんなさい。