处理超过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"));
当然,你可以用更抽象,更抽象的方式做到这一点,但这只是为了表明我的观点