如何使用编码.GetString与大量的数据?(把OutOfMemoryException)

本文关键字:数据 OutOfMemoryException 编码 何使用 GetString | 更新日期: 2023-09-27 17:52:39

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

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

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

如何使用编码.GetString与大量的数据?(把OutOfMemoryException)

我通常不会认为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)buffer处理count字节,从offset开始。在ASCII的情况下,您可能根本不使用编码;对于其他编码,您可以使用Encoding.GetDecoder() API来解码数据流,尽管它有点混乱。这两件事结合在一起将允许您处理任意大的(必要时多tb)数据源,而无需将其全部放在内存中。

下一个问题是:你打算用这些数据做什么 ?

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