我正在从web服务接收数据流并尝试将流的内容保存到文件。该流包含大量xml数据(在一行中)的标准文本行。该文件的大小约为800Mb。c#如何读取正常和xml文本元素的单个文件
问题:当我处理每行的xml部分时,收到内存不足异常。
==start file
line 1
line 2
<?xml version=.....huge line etc</xml>
line 3
line4
<?xml version=.....huge line etc</xml>
==end file
当前的代码,你可以看到当它读入巨大的xml行时,它会触发内存。
string readLine;
using (StreamReader reader = new StreamReader(downloadStream))
{
while ((readLine = reader.ReadLine()) != null)
{
streamWriter.WriteLien(readLine); //writes to file
}
}
我试图想在哪里使用两者的TextReader /的StreamReader和XmlTextReader的组合来处理每个部分的溶液。当我到达xml部分时,我可以切换到XmlTextReader并使用Read()方法来读取每个节点,从而停止内存峰值。
关于如何做到这一点的任何建议?或者,我可以创建一个能够读取这些行的自定义XmlTextReader?任何指针?
更新
另一个问题是这是我需要阅读这个文件拿过来,打出了两个XML部分分离的xml文件!我将解决方案转换为使用二进制写入器写入文件,然后开始使用二进制读取器重新读取文件。我有文本处理来检测XML部分的开始,特别是哪个XML部分,以便我可以将其映射到正确的文件!然而这会导致问题读二进制文件和做检测...
using (BinaryReader reader = new BinaryReader(savedFileStream))
{
while ((streamLine = reader.ReadString()) != null)
{
if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag1"))
//xml file 1
else if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag2"))
//xml file 2
我会这样的事情,因为这意味着你保持你消耗的内存量已知最大值。 – 2011-04-15 14:51:15
我遇到的唯一问题是它需要以人们可读的格式 - 要求!我必须重新读取此文件才能进行更多处理! – David 2011-04-15 14:53:57
格式不会改变,因此它将与输入文件一样可以被人类阅读。 – faester 2011-04-15 15:06:32