2

次のように構成されたデータセットがあります。

[TIMESTAMP] FIXED POSITION       DATA STRING
[TIMESTAMP] FIXED POSITION       DATA STRING
[TIMESTAMP] tag1=9324, tag2=19, tag3=55, etc
[TIMESTAMP] FIXED POSITION       DATA STRING

これらの 2 種類のレコードは、一定の間隔で要約データを含むタグベースのフィールドと混在しています。これらのデータ ファイルは、1 つのファイルで最大 1,000 万行になる場合があります。さらに、固定位置の行の中には数キロバイトの長さになるものもあり、それらを処理するときにメモリ管理の問題が発生します。

最初からファイルを処理する必要があります。サマリー エントリにヒットしたときにすべてのエントリをグループ化し、これらのサマリー エントリを固定位置エントリの特定のフィールドの集計とともに記録する必要があります。具体的には、固定位置セグメントの 1 つの特定の部分に 4 桁のステータス コードが含まれています。そのデータを要約レコードに追加する必要があります-最後の要約レコード以降に表示された各要約コードの出現回数。集計データとタイムスタンプのフィールドを含む各サマリー エントリは、CSV の行に変換する必要があります。

現在、これを行うためだけに ruby​​ コード/標準ライブラリを使用しています。小さいデータ セットの場合は問題ありませんが、大きいデータ セットの場合はパフォーマンスが急速に低下します。これは、一般的な ETL タイプの問題のように思えます。私は後でこのデータに対してより複雑なタイプの操作を行う予定であり、より複雑なレポートを作成するためにこれらのログ ファイルを常に再確認しているようです。

既存の ETL ツールまたはライブラリ (pref. Ruby) はありますか?

  1. 高パフォーマンスの混合 (正規表現/固定位置) 抽出をうまく実行します。
  2. 習得が容易です。
  3. メモリ管理を抽象化します。
  4. 無料/オープン ソースまたは低コスト (200 ドル未満) の商用です。

この問題に取り組むために何を使用するかについて、別の推奨事項を受け入れます。生の標準ライブラリの Ruby コードよりも優れたソリューションを探しているだけです。

4

1 に答える 1

1

入力/出力ファイルの形式を定義するためにxmlスキーマを使用するJavaライブラリ呼び出しhttp://jrecordbind.org/を実行しました

あなたのケースは「選択」要素の形で表現できると思います

<xs:complexType name="Choice">
<xs:choice>
  <xs:element name="one" type="One"/>
  <xs:element name="two" type="Two"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="One">
  <xs:sequence>
    <!-- fixed row definition -->
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Two">
  <xs:sequence>
    <!-- tag row definition -->
  </xs:sequence>
</xs:complexType>

この xsd の部分は、この入力ファイルで実行されるテストの 1 つから取得されます。

次に、解析された Java Bean を使用し、結果のメソッド getOne() および getTwo() のいずれかが null を返すかどうかに応じて、何をすべきかを選択する必要があります。

JRecordBind には「ストリーム」アプローチがあるため (実際にはスキーマに依存しますが)、メモリ消費は最小限に抑えられます。

于 2012-10-18T09:43:42.740 に答える