如何使用大量数据的Encoding.GetString? (抛出OutOfMemoryException)

时间:2013-01-11 07:51:30

标签: c# encoding out-of-memory

我正在从db读取二进制数据并使用代码将其转换为文本。

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

         return encEncoder.GetString(data);
       }

上面的过程正常工作但是当转换二进制文件> = 85mb时,OutOfMemoryException 如何显示。如何将大型二进制数据转换为字符串而不会出错。

1 个答案:

答案 0 :(得分: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)处理来自count的{​​{1}}个字节,从buffer开始。对于ASCII,您可以在不使用编码的情况下离开;对于其他编码,您可以使用offset API来解码数据流,尽管它有点混乱。这两个东西一起允许你处理一个任意大的(如果需要的是多TB)数据源,而不是一次全部存储在内存中。

接下来的问题是:你将用这些数据做什么

如果你一次在内存中需要它,你有没有选择但是要保留它。 可能能够使用迭代器块执行某些操作,依次返回字符串的片段