6

BinaryReader(MemoryStream(MyByteArray))を使用して、可変サイズのレコードを読み取り、それらをすべてメモリ内で処理します。これは、配列内にある私のバイトストリームのサイズが約1.7GB未満である限りうまく機能します。その後(私の64ビットシステムでは整数の最大サイズです)、十分な実メモリがありますが、より大きなバイト配列を作成することはできません。したがって、私の解決策は、バイトストリームを読み取り、それをいくつかのバイト配列に分割することでした。

ただし、バイト配列の境界を越えて「読み取る」ことはできません。また、データが可変形式であるため、バイト配列が常にレコード全体で終了することを保証できません。

これは、非常に大きなデータセットを処理する人々にとって一般的な問題であるに違いありませんが、それでも速度が必要です。

この問題をどのように処理しますか?

4

2 に答える 2

4

編集:基本を読んで、メモリマップファイルはシーケンシャルアクセスの通常のI / Oよりも遅くなる可能性があることに気付きました。

次のようなことを試しましたか:

var stream = new FileStream("data", 
    FileMode.Open, 
    FileAccess.Read, 
    FileShare.Read, 
    16 * 1024, 
    FileOptions.SequentialScan)

var reader = new BinaryReader(stream);

データがファイルにあり、.NET 4.0 を使用できる場合は、.NET の使用を検討してMemoryMappedFileください。

次に、 を使用しMemoryMappedViewStreamてストリームを取得するか、 を使用して のようなインターフェイス MemoryMappedViewAccessorを取得できます。BinaryReader

于 2010-09-06T11:56:00.717 に答える
3

ストリームが大きすぎる場合は、それをダンプしようとしないでください。代わりに、MemoryStreamのようなものを使用FileStreamして、ディスクと直接通信してください。通常、組み込みのバッファリングで十分です。または、次のように調整することもできますBufferedStream(ただし、必要になることはめったにありませんが、独自のデータ処理バッファを含める傾向があります)。

また、圧縮や密集したデータ、グラフ全体を一度に作成するのではなく、レコードをストリーミングBinaryReaderすることで機能するように設計されたシリアライザーなどを検討することもできます(ただし、前述のとおり、これはすでに高度に手動で行っている可能性があるため、これは問題ではない可能性があります) )。

于 2010-09-06T12:06:22.800 に答える