2012-04-20 15 views
1

1 KB〜200 MBのファイルを読み込んで解析するアプリケーションを作成しています。私はそれを2回解析する必要がバイナリファイルの読み込みと書き込みが最も高速です

...

  1. は、ファイルに含まれる画像を抽出します。

  2. イメージを解析するイメージの内容を抽出します。

私は一般に、ファイルストリーム、バッファリングされたストリーム、バイナリリーダー、バイナリライターを使用して内容を読み書きします。

さて、私はファイルを読み、内容を抽出するための最速かつ最も効率的な方法を知りたい...

良い方法や良いクラスライブラリはありますか?

注:安全でないコードはOKです!

+0

ここで最大のパフォーマンス向上は、ファイルを1回のパスで解析することで得られます。これはあなたがイメージを2回スキャンするのを避けるでしょう。 –

+0

@ルーク実際にはイメージは塊に含まれており、イメージのバイトのいくつかも解析前に[記録]する必要があります。 – Writwick

+0

はい、.NETファイルオブジェクトを使用するという点では、ファイルを読み込んでいる生の速度に関してパフォーマンスの差はあまりないはずです。あなたがこれを最適化しようとする何らかの理由はありますか? –

答えて

9

ファイルを読み込むための最速かつ最も簡単な方法は、単純である:

var file = File.ReadAllBytes(fileName); 

メモリにバイト配列としてファイル全体を読み込みます。その後、メモリアレイのアクセス速度で必要なものを探し出すことができます(つまり、非常に高速です)。これは、読んでファイルを処理しようとするよりも、確かに速いでしょう。

このファイルがメモリにうまく収まりきらない場合(そして、MB)は、チャンクでこれを行う必要があります。これが必要ない場合は、そのトリッキーな議論を避けることができます。 .NET 4.0を使用している場合、

  1. memory mapped filesWhat are the advantages of memory-mapped files?でそれ以上)を使用します。この場合の解決策は、どちらかになります。

  2. もしそうでなければ、読んだり、キャッシュしたり、メモリに保存しておくことができます。これは厄介で遅くなることがあります。

+1

実際にRawファイルにはHEADERとACHUNKが含まれていて、BCHUNK [ACHUNKとBCHUNKは2種類のブロックです]イメージはBCHUNKによって格納されていますので、これらのチャンクを読む必要があります... メモリマッピングファイル[このLibのコーディングを開始する前から使用しています]しかし、私はそれの信頼性についてはわかりません。しかし、今私はそれを使用してパフォーマンスを向上させる必要があるかもしれません。私は答えとしてそれをマークしていないが、本当に私を助けた。 – Writwick

+0

さて、あなたは投票することができます。それにもかかわらず、あなたの質問については何もメモリマップされたファイルを叫びません。 'ReadAllBytes'はあなたが必要とするすべてを行い、速く簡単です。とにかく。 – yamen

+0

私は15以下の評判を持っているので、私は投票できません。 配列関数はFileStream関数よりも遅いので、 'ReadAllBytes'を使うべきではありません。 – Writwick

関連する問題