mck*_*mck 3 c# encoding out-of-memory
我正在从db读取二进制数据并使用代码将其转换为文本.
public String BinaryToText(byte[] data)
{
System.Text.Encoding encEncoder = System.Text.ASCIIEncoding.ASCII;
return encEncoder.GetString(data);
}
Run Code Online (Sandbox Code Playgroud)
上面的过程正常工作但是当转换二进制文件> = 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, 0, buffer.Length))>0)
{
ProcessBytes(buffer, 0, read);
offset += read;
}
}
Run Code Online (Sandbox Code Playgroud)
其中ProcessBytes(byte[] buffer, int offset, int count)处理count从字节buffer开始,offset.在ASCII的情况下,你可以在不使用编码的情况下逃脱; 对于其他编码,您可以使用Encoding.GetDecoder()API来解码数据流,尽管它有点混乱.这两个因素将允许您处理任意大(多TB)(如果必要的话)数据源,而不会将所有数据源同时存储在内存中.
接下来的问题是:你打算用这些数据做什么?
如果你确实需要一次在内存中,你别无选择,只能握住它.您可以使用迭代器块执行某些操作,依次返回字符串的片段.