3

次の関数を使用して、バイナリ データをテキストに変換しています。

public string BinaryToText(byte[] data)
{
     MemoryStream stream = new MemoryStream(data);
     StreamReader reader = new StreamReader(stream, encoding.UTF8);
     string text = reader.ReadTod();
     return text;
}

しかし、私OutOfMemoryExceptionは30Mbのデータを取得します。

この問題を解決し、100Mb を超えるデータを変換するには、この方法またはより良い方法を使用するにはどうすればよいですか?

4

1 に答える 1

8

代わりにこれを試してください:

public string BinaryToText(byte[] data)
{
    return Encoding.UTF8.GetString(data);
}

消費するメモリが少なくなります。それでもメモリが不足している場合は、チャンクで読み取る必要がありますが、データをどのように使用しているかによって、それが可能かどうかが決まります。返された文字列で何をしていますか?

また、以前の質問を繰り返します。入力データは本当にUTF8データですか?

返されるデータを複数の文字列として処理できる場合は、次のようにすることができます。

public IEnumerable<string> BinaryToStrings(byte[] data, int maxStringLength)
{
    var buffer = new char[maxStringLength];

    using (MemoryStream stream = new MemoryStream(data))
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        while (true)
        {
            int count = reader.Read(buffer, 0, maxStringLength);

            if (count == 0)
            {
                break;
            }

            yield return new string(buffer, 0, count);
        }
    }
}

次に、次のようにforeachループでそれを呼び出すことができます。

foreach (string chunk in BinaryToStrings(data, 1024))
{
    // Do something with 'chunk'...
}
于 2013-01-14T15:05:23.137 に答える