处理超过2gb的字符串
本文关键字:字符串 2gb 处理 | 更新日期: 2023-09-27 18:07:51
我有一个应用程序,其中打开了包含大量用户输入数据的XLS文件,并将其中的数据转换为XML。我已经将XLS文件中的列映射到XML Maps。当我尝试在XMLMaps中使用ExportXml方法时,我得到一个字符串,其中包含XLS文件的适当XML表示。我稍微解析一下这个字符串并将其上传到服务器。
问题是,当我的XLS文件非常大时,为XML生成的字符串超过2 GB,并且我得到内存不足异常。我知道CLR对象的限制是2 GB。但在我的情况下,我需要处理这种情况。目前我只是消息要求用户发送更少的数据。
我该怎么做呢?
编辑:这只是我需要对生成的XML执行的操作的一个列表。
- 删除服务器数据不需要的某些字段。
- 为每一行数据添加ID号之类的东西。
- 修改某些元素的值。
- 对数据进行验证。
虽然XMLReader流是一个好主意,但我不能通过该方法执行这些操作。虽然数据验证可以由Excel本身完成,但其他事情无法在这里完成。
使用XMLTextReader和xmltextwwriter并为每个步骤创建一个自定义方法是我想到的解决方案。但是要完成上面的列表,需要对XML文档进行4次处理。这是没有效率的。
如果XML有那么大,那么您可能可以使用Export到临时文件,而不是使用ExportXML到字符串—http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xmlmap.export.aspx
如果您需要在c#中解析/处理XML,那么为了处理如此大的XML结构,您最好实现一个在流级别工作的自定义XMLReader(或XMLWriter)。有关类似的建议,请参阅这个问题——在c#中解析大型XML(大小为1GB)的最佳方法是什么?
我想如果你真的需要在RAM中保存整个东西,那么没有其他方法可以使用x64-OS和FX,但是使用Stuart may建议的其他方法来处理数据是更好的方法…
你需要做的是使用"流链",即你打开一个输入流,从你的excel文件读取和输出流写入你的xml文件。然后,转换类/方法将把这两个流作为输入,并从输入流中读取足够的数据,以便能够写入输出。
编辑:非常简单的最小示例
从文件转换:
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, e.g. remove ''r'n'
to.WriteLine(string.Format("<ListItem>{0}</ListItem>", bulk));
}
to.WriteLine("</List>");
}
}
Convert(File.OpenRead("source.xls"), File.OpenWrite("source.xml"));
当然你可以用更优雅,更抽象的方式来做但这只是为了说明我的观点