2011-12-23 38 views
0

現在、SQL Serverデータベースに大量のXMLファイルをロードするためにIntegration Services(SSIS)を使用しています。各XMLファイルの内容は、複数の表にディスパッチする必要があります。私はプロセスを使用してロードする少なくとも10000のXMLファイルを持っています。すべて6000ファイルが読み込まれるまでうまく動作します。 6000回の処理の後、私は最初のデータフロータスクから常にOutOfMemoryExceptionを取得しました。SSIS:大きな負荷とメモリ不足の例外

このスクリプトコンポーネントでは、XMLファイルの値が特定のデータベーステーブルに既に存在するかどうかを確認するだけです。存在する場合は一致したIDを返し、そうでなければ新しいレコードを追加します。これを達成するために、私はLookupコンポーネントを使用します。私はメモリの問題のために、キャッシュなしオプションでそれを使用します。次に一致する場合は、スクリプトコンポーネントで戻りIDを処理します。私が言ったように、多かれ少なかろうと6000のファイルが処理されるまで、すべて正常に動作します。私が得た後:

Description : System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e) 
at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute() 
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper) 

SSISのパフォーマンスとメモリの問題を扱ういくつかの提案やいくつかのリソースがありますか?あなたは同様の問題に遭遇しましたか?あなたはこの記憶の問題がどこから来るのかという考えを持っていますか?

感謝:)

EDIT: ここでXSDファイルに対してXMLをチェックするためのコードです。メモリリークが見えますか?

public void Main() 
    { 
     try 
     { 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.Schemas.Add("", Dts.Variables["XSDFilePath"].Value.ToString()); 
      settings.ValidationType = ValidationType.Schema; 

      using (XmlReader reader = XmlReader.Create(Dts.Variables["XMLFilePath"].Value.ToString(), settings)) 
      { 
       XmlDocument document = new XmlDocument(); 
       document.Load(reader); 

       ValidationEventHandler eventHandler = new ValidationEventHandler(XMLValidationHandler); 
       document.Validate(eventHandler); 
      } 

      if (ValidationResult) 
      { 
       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
      else 
      { 
       Dts.TaskResult = (int)ScriptResults.Failure; 
      } 

     } 
     catch (Exception ex) 
     { 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 


    private void XMLValidationHandler(object sender, ValidationEventArgs e) 
    { 
     switch (e.Severity) 
     { 
      case XmlSeverityType.Error: 
       Console.WriteLine("Warning {0}", e.Message); 
       ValidationResult = false; 
       break; 
      case XmlSeverityType.Warning: 
       Console.WriteLine("Warning {0}", e.Message); 
       break; 
     } 
    } 
+0

私はあなたのコードを見て開始します。これは記憶のようなにおいがしますが、そこではうまく管理されていませんが、より具体的に言えば、コード、パッケージ、サンプルXMLなどを見ることなく言うことができません。 – billinkc

+0

あなたの答えをありがとう。今度は私のパッケージから多くのテーブルが読み込まれなくなりました。ちょうど始まりを維持し、どこから問題が発生しているのかを特定しようとしています。私がC#で書いた唯一のコードは、XMLファイルをXSDファイルと照合することです。私は上の私のポストにそれを追加するつもりです。これは、ルックアップコンポーネントを使用してデータがテーブルにまだ存在していないかどうかを検証する2つのデータフロータスクと、親子関係を作成するために挿入された最後のIDを取得するもう1つのタスクによって行われます。すべてが非常に大きなforeachループの中にあり、私が少しずつメモリを見ると、それはダウンしています。 – Luyi

+0

設定、ドキュメント、およびイベントハンドラでusingの構文を試してみてください。これらをソースとして削除するには – billinkc

答えて

0

XMLDocumentオブジェクトを使用しないでください。ドキュメント全体がメモリに読み込まれ、メモリの問題の原因になっている可能性があります。これは、メモリのより効率的な使用を提供すべきであるXmlValidatingReaderを

http://msdn.microsoft.com/en-us/library/system.xml.xmlvalidatingreader.aspx

を使用する代わりに試してみてください。

関連する問題