2010-11-22 5 views
1

ベスト/高速メソッドを表示してください。C#バイナリファイルをロードする

1)非常に小さなバイナリファイルをメモリにロードしています。例えば、アイコン。

2)サイズが512Mb +の非常に大きなバイナリファイルの読み込み/読み込み。

3)サイズ/スピードについて考える必要はありませんが、すべてのバイトをメモリに読み込みます。

ありがとうございます!

P.S.多分簡単な質問を申し訳ありません。それを閉じないでください)

P.S.2。 Javaのためのアナログの質問Mirror;

+1

あなたが興味のあることには、次の資料を見つけることがあります。http://www.codeproject.com/KB/files/ fastbinaryfileinput.aspx –

答えて

4

1:非常に小さいファイルの場合、File.ReadAllBytesは問題ありません。

2:非常に大きなファイルと.net 4.0を使用する場合は、MemoryMappedファイルを使用できます。

3:良い選択となるデータのチャンクを読んで、より.NET 4.0を使用していない場合は

+0

すべての回答には有用な理由があります。しかし、大きなファイルの場合、私はMemoryMappedファイルを好む - ネイティブWindows APIの古い親友;) – Edward83

4

1)リソースファイルをたくさんの別々のファイルとして保存するのではなく、そのファイルを使用します。

2)データを一度にすべて読み込むのではなく、ストリーミングしたい場合は、FileStreamを使用できます。

3):使用ReadAllBytes

byte[] bytes = File.ReadAllBytes(path); 
2

1:小、File.ReadAllBytes

2の場合:、大きなストリーム(のFileStream)またはストリームにBinaryReaderについて - 目的は、除去すること小さな塊を連続して読み取るコードを変更して大量のバッファを割り当てる必要性

3:戻って期待されるサイズを見つけてください。デフォルトのワーストケース(#2)

私は最初に、データフォーマットや圧縮の選択によってsiEを最小限に抑えようとしています。

-1

このサンプルは、バッファリングされた読み込みが必要な大容量ファイルの両方に適しています。

public static byte[] ReadFile(string filePath) 
{ 
    byte[] buffer; 
    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
    try 
    { 
    int length = (int)fileStream.Length; // get file length 
    buffer = new byte[1024];   // create buffer 
    int count;       // actual number of bytes read 
    int sum = 0;       // total number of bytes read 

    // read until Read method returns 0 (end of the stream has been reached) 
    while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
     sum += count; // sum is a buffer offset for next reading 
    } 
    finally 
    { 
     fileStream.Close(); 
    } 
     return buffer; 
    } 
+0

これは、File.ReadAllBytesよりも優れているわけではありません。なぜ作品を発明するのですか? –

+0

(大きなファイルのために巨大なバッファを割り当てる必要があるという主な問題点) –

+0

なぜ巨大なバッファが必要なのでしょうか?1024のバッファサイズは読み込み速度を大幅に改善します。 – dexter

関連する問題