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;
  }
}

whereProcessBytes(byte[] buffer, int offset, int count)处理来自 的count字节buffer,从 开始offset。在 ASCII 的情况下,您可能根本不使用编码就可以逃脱;对于其他编码,您可以使用Encoding.GetDecoder()API 来解码数据流,虽然它有点乱。这两件事一起将允许您处理任意大(必要时为数 TB)的数据源,而无需一次将其全部存储在内存中。

那么,下一个问题是:你打算如何处理这些数据?

如果您确实需要一次将其全部存储在内存中,那么您别无选择,只能保留它。您可以使用迭代器块做一些事情,依次返回字符串的片段

于 2013-01-11T08:01:57.177 回答