2017-11-01 15 views
0

x秒よりも長く発生するトークンペアを見つけようとしています。多くの大きなXMLファイルを解析する - 一致するトークンがx秒以上離れて出力されたときに出力する

XMLデータは次のようになります。

<entry stamp="2017-10-30T19:19:59" level="MESSAGE" location="Process" message="token is 191"/> 
<entry stamp="2017-10-30T19:20:59" level="MESSAGE" location="Process" message="token is 192"/> 
<entry stamp="2017-10-30T19:21:59" level="MESSAGE" location="Process" message="token is 193"/> 
<entry stamp="2017-10-30T19:22:59" level="MESSAGE" location="Process" message="token is 194"/> 
<entry stamp="2017-10-30T19:23:59" level="MESSAGE" location="Process" message="token is 191"/> 
<entry stamp="2017-10-30T19:24:59" level="MESSAGE" location="Process" message="token is 192"/> 
<entry stamp="2017-10-30T19:25:59" level="MESSAGE" location="Process" message="token is 193"/> 
<entry stamp="2017-10-30T19:25:59" level="MESSAGE" location="Process" message="token is 194"/> 

実際のメッセージは非常に長いです。それはそれぞれにトークンを持っています。

一意のINトークンを持つ行があり、それに対応するOUTトークンがあります。

通常、INトークンとOUTトークンは互いに1秒以内に発生します。

これらのファイルはHUGE - 100MBであり、数百もあります。

x秒以上離れて発生する外れ値はわずかです。

これらの行が存在する場合は、ファイルに追加します。

どのような考えですか?私はxmlstarletを使用していますが、RHELでそのアイデアを把握して実行することができれば、基本的には何もできます。

+0

_ "一意のINトークンを持つ行があり、それに対応するOUTトークンがあります。" _ _これはあなたが示したXMLにどのように関係していますか?ヘルプが必要な場合は、関連するすべての情報とデータを表示する必要があります。 –

+0

私は、 '@ message'を持つ最初の' '要素がINトークンとして解釈され、同じ' @ message'を持つ2番目の ''要素が対応するOUTトークンとして解釈されると思います。しかし、私は完全に間違っているかもしれません、説明は確かに明確ではありません。 –

+0

RHEL = Red Hat Enterprise Linuxを探すために誰かを救うために。 –

答えて

1

ここでは、XSLT 3.0でストリーミングを使用する方法を示します。どのように動作する

<xsl:mode streamable="yes"/> 
<xsl:template match="/*"> 
    <xsl:iterate select="entry"> 
    <xsl:param name="unmatched" select="map{}"/> 
    <!-- the param contains a map from @message to @stamp --> 
    <xsl:variable name="token" select="string(@message)"/> 
    <xsl:variable name="time" select="xs:dateTime(@stamp)"/> 
    <xsl:choose> 
     <xsl:when test="map:contains($unmatched, $token)"> 
     <xsl:if test="$time - map:get($unmatched, $token) 
         gt xs:dayTimeDuration('PT1S')"> 
      <outlier>{$token}</outlier> 
     </xsl:if> 
     <xsl:next-iteration> 
      <xsl:with-param name="unmatched" 
          select="map:remove($unmatched, $token)"/> 
     </xsl:next-iteration> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:next-iteration> 
      <xsl:with-param name="unmatched" 
          select="map:put($unmatched, $token, $time)"/> 
     </xsl:next-iteration> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:iterate> 
</xsl:template> 

:変数$unmatchedにバインドされたマップに現在の状態を維持し、entry要素の上にストリーミングされた反復処理を実行します。どの時点でも、変数はINイベントが発生したがOUTイベントが発生していないトークンを保持します。特定のエントリを処理する場合は、まず、トークンがこのマップに存在するかどうかに基づいてINイベントかOUTイベントかを判断します。 OUTイベントの場合は、タイムスタンプとINイベントを比較し、1秒以上経過した場合はそれを異常値として報告します。いずれの場合も、マップからトークンをドロップします。 INイベントの場合は、トークンをマップに追加した後に続行します。

実際、ストリーミングなしで100Mbを処理できるはずなので、無料のSaxon-HE製品でストリーミングをオフにして試すことができます。 500Mbを超えるとストリーミングを有効にする必要があります。

関連する問題