2017-10-30 5 views
1

私は1つのファイルにたくさんの小さなXMLファイルを縫い合わせ、カスタム抽出プログラムを作成して各ファイルに対応する1バイト配列の行を返しました。 (gzipで圧縮され、11Mビット)一つのファイルのためのリモコンのOutOfMemory on custom extractor

  1. 実行/マスター
    • 実行それは、それが正常に動作します。
    • 複数のファイルを実行すると、System.OutOfMemoryExceptionが発生します。ローカル/マスター(500 + MBをgzip圧縮された)は、1つのまたは複数のファイルのための
      • 実行それを
    • 実行し、正常に動作します。

Extractorのは、次のようになります。

public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output) 
    { 

     using (var stream = new StreamReader(input.BaseStream)) 
     { 
      var xml = stream.ReadToEnd(); 

      // Clean stiched XML 
      xml = UtilsXml.CleanXml(xml); 

      // Get nodes - one for each stiched file 
      var d = new XmlDocument(); 
      d.LoadXml(xml); 
      var root = d.FirstChild; 

      for (int i = 0; i < root.ChildNodes.Count; i++) 
      { 
       output.Set<object>(1, Encoding.ASCII.GetBytes(root.ChildNodes[i].OuterXml.ToString())); 
       yield return output.AsReadOnly(); 
      } 

      yield break; 
     } 
    } 

とエラーメッセージは次のようになります。

==== Caught exception System.OutOfMemoryException 

at System.Xml.XmlDocument.CreateTextNode(String text) 
at System.Xml.XmlLoader.LoadAttributeNode() 
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace) 
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) 
at System.Xml.XmlDocument.Load(XmlReader reader) 
at System.Xml.XmlDocument.LoadXml(String xml) 
at Microsoft.Analytics.Tools.Formats.Text.XmlByteArrayRowExtractor.<Extract>d__0.MoveNext() 
at ScopeEngine.SqlIpExtractor<ScopeEngine::GZipInput,Extract_0_Data0>.GetNextRow(SqlIpExtractor<ScopeEngine::GZipInput\,Extract_0_Data0>* , Extract_0_Data0* output) in d:\data\ccs\jobs\bc367467-ef86-43d2-a937-46ba2d4cc524_v0\sqlmanaged.h:line 1924 

だから私は間違って何をやっていますか?リモートでこれをどのようにデバッグするのですか?

ありがとうございます!

答えて

1

残念ながら、ローカルランはメモリ割り当てを強制しませんので、ローカル頂点デバッグのメモリを自分でチェックする必要があります。

上記のコードを見ると、XML文書をDOMにロードしていることがわかります。 XML DOMは、データサイズを文字列表現から10以上のファクターまで爆発させる可能性があることに注意してください(常駐のSQL XML guruとして私の時間に2〜12回見たことがあります)。

今日、各UDOは、再生に1/2GBのRAMしか得られません。だから、私はあなたのXML DOMドキュメントがそれを超えて始めると仮定します。

通常、XMLReaderインターフェイス(http://usql.ioのサンプルにはリーダーエクストラクタがあります)を使用して、ドキュメントをスキャンして、探している情報を見つけることをお勧めします。

文書が常に十分小さい場合(たとえば、< 20MB)、他の文書のメモリを解放して一度に1つの文書を操作することを確認することができます。

UDOにメモリのニーズに注釈を付ける計画はありますが、それでも少し外です。

+0

あなたはメモリ例外の原因について正しいと思います。代わりにXmlReaderで作業するように私のカスタムエクストラクタを再コーディングしました。そして、ドキュメントをDOMにロードしないので問題はありません。 xmlは非常に素敵でクリーンではないので、XMLファイルと非常に深いxml構造の両方であるため、私は独自のエクストラクタを使用する必要があります。 ありがとうございました! – Anders