我正在从Web服务接收数据流,并尝试将流的内容保存到文件中.该流包含标准文本行以及大量xml数据块(一行).文件大小约为800Mb.
问题:处理每行的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
解决方法:
如果您要做的就是在不修改数据的情况下将一个流复制到另一个流,则不需要流文本或二进制帮助程序(StreamReader,StreamWriter,BinaryReader,BinaryWriter等),只需复制流即可.
internal static class StreamExtensions
{
public static void CopyTo(this Stream readStream, Stream writeStream)
{
byte[] buffer = new byte[4096];
int read;
while ((read = readStream.Read(buffer, 0, buffer.Length)) > 0)
writeStream.Write(buffer, 0, read);
}
}