2016-07-26 5 views
0

マシン構成は4CPU 16GB RAMで、800MBと300MBのXMLファイルを処理しようとしています。 .NET Saxon APIはスタックトレースの下でメモリ例外をスローすることがあります。前の数時間はperfstatsを見て、サーバーには10GBの空きメモリがあるようです。以下のコードは、Task.Run()を使用して並列タスクで実行されます。助言してください。 800MBの入力ファイルでC#.NET SaxonApiのメモリ不足例外

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) 
+0

いいえSaxon APIに何か提案がある場合は、まだ調査中です。 –

+0

アプリケーションが64ビットマシン上で32ビットとして実行されている場合、SAXON APIは大きなファイルのメモリ不足例外を引き起こします... –

答えて

0

私はあなたの例で使用可能なヒープメモリの実際の量以外の制限、配列や文字列の最大サイズを打つ始めることができると思います。これはあなたが見ている効果かもしれません。 TinyTreeがスペースを節約する1つの方法は、多数の小さなオブジェクトではなく小さなオブジェクトを使用することです。そのため、この効果が発生します。

TinyTree.condense()メソッド(失敗した場所)は、ツリー構築の最後に呼び出され、TinyTreeデータ構造に使用される配列内の未使用領域を再利用しようとします。これは、使用されている実際のサイズまで小さな配列を割り当て、データをコピーすることによって行われます。したがって一時的に追加のメモリが必要です。これが障害の発生場所です。コードを見ると、実際には必要な一時メモリの量を減らすことができます。

データに繰り返しのテキストや属性値がある場合は、その値を一般化しようとする「TinyTreeCondensed」オプションを使用する価値があります。しかし、このような重複がなければ、ツリー構築プロセス中の索引作成に使用されるスペースのために、これは逆効果になる可能性があります。

このデータが大きいと、代替戦略を検討することをお勧めします。たとえば、XMLデータベース。ストリーミング処理;ファイルを複数のファイルに分割する。ドキュメント投影。あなたが解決しようとしている問題についての大きなイメージを知らなければ、このことについて助言することは不可能です。

+0

TinyTree.condense()中に使用される一時的な領域を減らすために改善を実装しました。 //saxonica.plan.io/issues/2857 –

+0

マイケルに感謝します。また、プラットフォームターゲットx64にアプリケーションをコンパイルして、メモリ不足の問題が解決されているかどうかを確認しようとしています。一度テストすると更新されます。 –

+0

アプリケーションをプラットフォームターゲットx64にコンパイルすると、メモリエラーが解決され、800MBを超えるファイルを処理できました。 –