2

大きな生ボリューム ファイル (MRI スキャンなど) の内容を読み書きしたいと考えています。これらのファイルは、たとえば 32 x 32 x 32 の float のシーケンスであるため、1D 配列に適切にマップされます。バイナリ ボリューム ファイルの内容を float または ushort (バイナリ ファイルのデータ型に応じて) などの 1D 配列に読み込んで、同様に配列を raw ボリューム ファイルにエクスポートできるようにしたいと考えています。

C#でこれを行う最良の方法は何ですか? BinaryReader/BinaryWriter で一度に 1 つの要素を読み書きしますか? それらを FileStream.Read でバイト配列に断片的に読み込んでから、配列間で System.Buffer.BlockCopy を実行しますか? 独自のリーダー/ライターを作成しますか?

編集: 2 GB を超えるアレイでは動作しないようですが、問題はまだ小さいアレイ (約 256 MB 程度) を表しています。

4

1 に答える 1

3

2GB を超えるデータを含む配列を取得することはありません。私の記憶では、オブジェクトあたり 1 GB の CLR 制限があります。64 ビットの.NET 4 では解除された可能性がありますが、聞いたことがありません。

編集:この記事によると、制限は 1GB ではなく 2GB ですが、それでも 2GB 以上は管理できません。

一度にすべてのデータをメモリに格納する必要がありますか? 一度にそれのチャンクに取り組むことができますか?

編集:さて、ファイルからfloat配列に読み込むだけですか?BinaryReader.Read(byte[], int, int)チャンクを (またはを使用してBinaryReader.ReadBytes(int)) 読み取り、それを使用Buffer.BlockCopyしてバイトから float などに効率的に変換するのがおそらく最も簡単です。ただし、これはエンディアンに依存することに注意してください。より堅牢に変換したい場合 (後でエンディアンを変更したり、ビッグ エンディアン プラットフォームで実行したりできるようにするため)、おそらくReadFloat()繰り返し呼び出す必要があります。

コードのこの領域に実際にパフォーマンスの問題があることをどの程度確信していますか? まず、機能する最も単純なことを実行してから、それをプロファイリングする価値があります...

于 2010-04-08T14:36:11.560 に答える