处理超过2 GB的string

我有一个应用程序,用户input的大量数据的XLS文件被打开,其中的数据被转换为XML。 我已经将XLS文件中的列映射到XML映射。 当我尝试在XMLMaps中使用ExportXml方法时,我得到一个具有XLS文件的正确XML表示的string。 我parsing这个string有点上传到我的服务器。

问题是,当我的XLS文件非常大时,为XML生成的string超过2 GB,并且出现Out of Memoryexception。 我知道CLR对象的限制是2 GB。 但在我的情况下,我需要处理这种情况。 目前我只是要求用户发送较less的数据。

任何想法如何我可以做到这一点?

编辑:

这只是我需要对生成的XML进行操作的一个问题。

  • 删除某些服务器数据不需要的字段。
  • 为每行数据添加类似ID号码的内容。
  • 修改某些元素的值。
  • 对数据进行validation。

虽然XMLReaderstream是一个好主意,但是我不能通过这种方法来执行这些操作。 虽然数据validation可以通过Excel自己完成,但其他的事情不能在这里完成。

使用XMLTextReader和XMLTextWriter并为每个步骤创build一个自定义方法是我想到的解决scheme。 但要通过上面的jist,它需要XML文档经过或处理4次。 这只是没有效率。

如果XML很大,那么您可能可以使用导出到临时文件,而不是使用ExportXML到一个string – http://msdn.microsoft.com/en-us/library/microsoft.office.interop。 excel.xmlmap.export.aspx

如果您需要在C#中parsing/处理XML,那么为了处理如此庞大的XML结构,您可能会更好地实现在stream级别工作的自定义XMLReader(或XMLWriter)。 看到这个问题的一些类似的build议 – 什么是在C#中parsing大型XML(大小为1GB)的最佳方式?

我猜想,如果你真的需要把所有东西放在RAM中,使用x64-OS和FX是没有其他办法的,但是用Stuartbuild议的方式处理数据可能是更好的方法。

你需要做的是使用“stream链接”,即你打开一个inputstream,从您的Excel文件和输出stream写入到您的XML文件读取。 然后你的转换类/方法将把这两个stream作为input,并从inputstream中读取足够的数据,以便能够写入输出。

编辑:非常简单的最小的例子

从文件转换:

123 1244125 345345345 4566 11 

  <List> <ListItem>123</ListItem> <ListItem>1244125</ListItem> ... </List> 

运用

  void Convert(Stream fromStream, Stream toStream) { using(StreamReader from= new StreamReader(fromStream)) using(StreamWriter to = new StreamWriter(toStream)) { to.WriteLine("<List>"); while(!from.EndOfStream) { string bulk = from.ReadLine(); //in this case, a single line is sufficient //some code to parse the bulk or clean it up, eg remove '\r\n' to.WriteLine(string.Format("<ListItem>{0}</ListItem>", bulk)); } to.WriteLine("</List>"); } } Convert(File.OpenRead("source.xls"), File.OpenWrite("source.xml")); 

当然,你可以用更抽象,更抽象的方式做到这一点,但这只是为了表明我的观点