将字节数组转换为字符串时获取'System.OutOfMemoryException'

时间:2009-01-06 18:53:10

标签: c# .net optimization

代码段:

//byte[] myByteArray = byte array from database (database BLOB) 
myByteArray = (byte[]) ((dbCommand.Parameters["parameter"].Value));

string myString =System.Text.Encoding.UTF8.GetString(myByteArray);

Xmldocument doc = new Xmldocument();
doc.Load(myString);

============

我有时候会System.OutOfMemoryException

string myString = System.Text.Encoding.UTF8.GetString(myByteArray);

将bytearray转换为字符串时出现此错误。

有没有办法让这段代码变得健壮。

我想要做的就是在字节数组中加载BLOB,然后将它们转换为字符串 并将它们加载到xmldocument中以使用。

4 个答案:

答案 0 :(得分:7)

如果您有一个包含XML文本的字符串,那么您实际上需要XmlDocument.LoadXML。 XmlDocument.Load将字符串视为URL。

也就是说,XmlDocument.Load有过载XmlReader,TextReader或Stream的重载。您可以在底层字节数组上创建一个MemoryStream,然后传递它;这可以避免字符串转换。

答案 1 :(得分:1)

XmlDocument.Load(String)尝试从作为参数给出的URL加载XML文档,即它尝试将您可能的巨大字符串解释为URL。难怪出现问题。

改为使用LoadXml()。

答案 2 :(得分:1)

听起来你的blob太大了,不能像字符串那样适合记忆。不要忘记,ASCII值的大小是二进制形式的字符串的两倍。无论如何, 这些价值有多大?

之后您需要对字符串做什么?您显示将其加载为XML(尽管正如Roger所说,您真的想要LoadXml)但不是您计划在此之后做的事情。你能做一些流式传输数据吗?如果是这样,将字节数组包装在MemoryStream中,然后在其上使用StreamReader。

答案 3 :(得分:0)

Strings / StringBuilders需要连续的内存块,因此OutOfMemoryException与堆的碎片密切相关。

话虽这么说,你需要对输入进行分块或者已经建议使用流。