除非您的内存不足等,否则我通常不会认为 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)的数据源,而无需一次将其全部存储在内存中。
那么,下一个问题是:你打算如何处理这些数据?
如果您确实需要一次将其全部存储在内存中,那么您别无选择,只能保留它。您可以使用迭代器块做一些事情,依次返回字符串的片段。