1

行区切りの JSON レコードを含むファイルがあるとします。

{"id": 1, "position": 1234}
{"id": 2, "position": 23}
{"id": 3, "position": 43}
{"id": 1, "position": 223}

IDの最後のレコードのみを保持することにより、そのようなファイルを圧縮したいと思います。たとえば、上記の例の場合、出力として持ちたいと思います。

{"id": 2, "position": 23}
{"id": 3, "position": 43}
{"id": 1, "position": 223}

tldr; uniq行区切りの JSON で動作する (そして高速な) はありますか?


入力ファイルには 10 億のレコードが含まれている可能性があり、そのうちの 10 ~ 20% のレコードを破棄できます。

私はさまざまなアプローチを試しました:

  1. 見たID

    「見た」ID のセットをメモリに保持します。これはメモリ不足です。

  2. 並べ替えと一意

    最初に「id」でファイルを並べ替えます (安定した並べ替えを使用するため、順序が保持されます)。次に、ファイルをもう一度実行し、最後のレコードを保持します。これは、通常の UNIXsort | uniqアプローチに似ています。ここではソートにコストがかかり、おそらく作業が多すぎます。

  3. オフセットと長さの情報を抽出する

    ファイルからオフセットと長さの情報と ID を抽出します。

    id offset length
    1  0      27
    2  27     25
    3  52     25
    1  77     26
    

そして、圧縮されたセットに属するレコードを見つけます。次に、ファイルをシークして読み取ります。この情報の抽出はかなり高速ですが、レコードを抽出するために何百万ものシークと読み取りが行われるため、このアプローチは遅くなります。


より優れた、より高速な (または最速の) アプローチは何でしょうか? この種の問題を解決する既存のツールはありますか?

4

1 に答える 1

0

この問題は、次の 3 つの手順で解決できます。

  1. jqldjtabなどのツールを使用して、興味深い値 (および行番号) を抽出します。
  2. tacおよびを使用しsort -uて、関連する行のみを保持します。
  3. 元のファイルをフィルター処理し、指定された行のみを保持します ( filterlineなどのツールやその他のいくつかのアプローチは、ファイルをフィルター処理し、特定の指定された行のみを保持します)。

全体的なプロセスは非常に効率的です。ステップ 1 と 2 は並列化可能です。ステップ 3 は高速化できます。

于 2015-06-19T15:53:41.510 に答える