4

db からバイナリ データを読み取り、コードを使用してテキストに変換しています。

       public String BinaryToText(byte[] data)
       {
         System.Text.Encoding encEncoder = System.Text.ASCIIEncoding.ASCII;

         return encEncoder.GetString(data);
       }

上記の手順は正しく機能しますが、バイナリ ファイル >= 85mb を変換すると OutOfMemoryException が表示されます。大きなバイナリ データをエラーなく文字列に変換する方法。

4

1 に答える 1

7

通常、メモリが不足していない限り、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つの機能を組み合わせることで、一度にすべてをメモリに保存しなくても、任意のサイズ(必要に応じて数テラバイト)のデータソースを処理できます。countbufferoffsetEncoding.GetDecoder()

次の質問は、このデータをどうするかということです。

すべてを一度にメモリに保存する必要がある場合は、それを保持するしかありません。文字列のフラグメントを順番に返すために、イテレータブロックを使用して何かを実行できる場合があります

于 2013-01-11T08:01:57.177 に答える