行区切りの 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% のレコードを破棄できます。
私はさまざまなアプローチを試しました:
見たID
「見た」ID のセットをメモリに保持します。これはメモリ不足です。
並べ替えと一意
最初に「id」でファイルを並べ替えます (安定した並べ替えを使用するため、順序が保持されます)。次に、ファイルをもう一度実行し、最後のレコードを保持します。これは、通常の UNIX
sort | uniq
アプローチに似ています。ここではソートにコストがかかり、おそらく作業が多すぎます。オフセットと長さの情報を抽出する
ファイルからオフセットと長さの情報と ID を抽出します。
id offset length 1 0 27 2 27 25 3 52 25 1 77 26
そして、圧縮されたセットに属するレコードを見つけます。次に、ファイルをシークして読み取ります。この情報の抽出はかなり高速ですが、レコードを抽出するために何百万ものシークと読み取りが行われるため、このアプローチは遅くなります。
より優れた、より高速な (または最速の) アプローチは何でしょうか? この種の問題を解決する既存のツールはありますか?