【问题标题】:C# .Net SaxonApi throwing out of memory exceptionC# .Net SaxonApi 抛出内存异常
【发布时间】:2016-07-26 17:14:01
【问题描述】:

机器配置为 4CPU 16 GB RAM 并尝试处理 800MB 和 300MB XML 文件。有时 .NET Saxon API 会在堆栈跟踪下方抛出内存不足异常。查看了前几个小时的 perfstats,服务器似乎有 10GB 的可用内存。下面的代码是使用 Task.Run() 在并行任务中运行的,请告知。

 DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
 documentBuilder.IsLineNumbering = true;
 documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
 XdmNode _XdmNode = documentBuilder.Build(xmlDocumentToEvaluate);

System.Exception: Error in ExecuteRules method ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at net.sf.saxon.tree.tiny.TinyTree.condense(Statistics )
   at net.sf.saxon.tree.tiny.TinyBuilder.close()
   at net.sf.saxon.event.ProxyReceiver.close()
   at net.sf.saxon.pull.PullPushCopier.copy()
   at net.sf.saxon.event.Sender.sendPullSource(PullSource , Receiver , ParseOptions )
   at net.sf.saxon.event.Sender.send(Source source, Receiver receiver, ParseOptions options)
   at net.sf.saxon.Configuration.buildDocument(Source source, ParseOptions parseOptions)
   at net.sf.saxon.Configuration.buildDocument(Source source)
   at Saxon.Api.DocumentBuilder.Build(XmlReader reader)
   at Saxon.Api.DocumentBuilder.Build(XmlNode source)

【问题讨论】:

  • 没有。如果 Saxon API 有任何建议,我仍在调查并寻求帮助。
  • 如果应用程序在 64 位机器上以 32 位运行,SAXON API 是否会导致大文件的内存不足异常...

标签: c# .net saxon


【解决方案1】:

对于 800Mb 的输入文件,我认为您可以开始达到除实际可用堆内存量之外的限制,例如数组或字符串的最大大小。这可能是您看到的效果。 TinyTree 节省空间的一种方法是使用少量大对象而不是大量小对象,因此它可以触发这种效果。

TinyTree.condense() 方法(这是它失败的地方)在树构造结束时调用,并尝试回收用于 TinyTree 数据结构的数组中未使用的空间。这是通过将较小的数组分配到实际使用的大小并复制数据来完成的。所以暂时它需要额外的内存,这就是发生故障的地方。查看代码,实际上有机会减少所需的临时内存量。

如果您的数据中有很多重复的文本或属性值,那么可能值得使用“TinyTreeCondensed”选项来尝试共享这些值。但是,如果没有这样的重复,这可能会适得其反,因为在树构建过程中用于索引的空间。

有了这么大的数据,我认为研究替代策略是个好主意。例如:XML 数据库;流式处理;将文件拆分为多个文件;文档投影。如果不了解您要解决的问题的总体情况,就不可能就此提出建议。

【讨论】:

  • 我已实施改进以减少 TinyTree.condense() 期间使用的临时空间 - 请参阅 saxonica.plan.io/issues/2857
  • 谢谢迈克尔。我还尝试将我的应用程序编译到平台目标 x64 以查看它是否解决了内存不足问题。测试后会更新。
  • 将应用程序编译到平台目标 x64,内存错误得到解决,并且能够处理大于 800MB 的文件。
猜你喜欢
  • 2014-12-15
  • 1970-01-01
  • 2014-03-15
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多