gpt4 book ai didi

c# - 如何使用 Encoding.GetString 处理大量数据? (抛出 OutOfMemoryException)

转载 作者:行者123 更新时间:2023-11-30 14:13:26 28 4
gpt4 key购买 nike

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

       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, 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),而无需一次将其全部存储在内存中。

那么,下一个问题是:您要使用这些数据做什么?

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

关于c# - 如何使用 Encoding.GetString 处理大量数据? (抛出 OutOfMemoryException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273873/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com