加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用包含大量数据的Encoding.GetString? (抛出OutOfM

发布时间:2020-12-16 01:52:24 所属栏目:百科 来源:网络整理
导读:我正在从db读取二进制数据并使用代码将其转换为文本. public String BinaryToText(byte[] data) { System.Text.Encoding encEncoder = System.Text.ASCIIEncoding.ASCII; return encEncoder.GetString(data); } 上面的过程正常工作但是当转换二进制文件 = 85
我正在从db读取二进制数据并使用代码将其转换为文本.

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

         return encEncoder.GetString(data);
       }

上面的过程正常工作但是当转换二进制文件> = 85mb时,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,buffer.Length))>0)
  {
     ProcessBytes(buffer,read);
     offset += read;
  }
}

其中ProcessBytes(byte [] buffer,int offset,int count)处理缓冲区中的字节数,从offset开始.在ASCII的情况下,你可以在不使用编码的情况下逃脱;对于其他编码,您可以使用Encoding.GetDecoder()API来解码数据流,尽管它有点混乱.这两个因素将允许您处理任意大(多TB)(如果必要的话)数据源,而不会将所有数据源同时存储在内存中.

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

如果你确实需要一次在内存中,你别无选择,只能握住它.您可以使用迭代器块执行某些操作,依次返回字符串的片段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读