通常、メモリが不足していない限り、85MBも問題になるとは思いません。通常、x86でも、息を止めずに処理できます。
大量のデータの場合、最も簡単な答えは常に「一度にすべてをメモリに保持しないでください」です。ADO.NETには、データリーダーに転送専用のAPIがあり、連続した呼び出しで大きなBLOBのさまざまな部分をフェッチできます。
using(var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{ // ^^ forwards-only mode ^^
long offset = 0;
int read;
byte[] buffer = new byte[8096];
while ((read = reader.GetBytes(colIndex, offset, buffer, 0, buffer.Length))>0)
{
ProcessBytes(buffer, 0, read);
offset += read;
}
}
ここで、からバイトをProcessBytes(byte[] buffer, int offset, int count)
処理します。ASCIIの場合、エンコーディングをまったく使用せずに回避できる可能性があります。他のエンコーディングの場合、APIを使用してデータのストリームをデコードできますが、少し面倒です。これら2つの機能を組み合わせることで、一度にすべてをメモリに保存しなくても、任意のサイズ(必要に応じて数テラバイト)のデータソースを処理できます。count
buffer
offset
Encoding.GetDecoder()
次の質問は、このデータをどうするかということです。
すべてを一度にメモリに保存する必要がある場合は、それを保持するしかありません。文字列のフラグメントを順番に返すために、イテレータブロックを使用して何かを実行できる場合があります。