处理超过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次处理。这是没有效率的。

处理超过2gb的字符串

如果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"));

当然你可以用更优雅,更抽象的方式来做但这只是为了说明我的观点