JSON 日志文件压缩

JSON log file compaction

给定一个包含行分隔 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

    在内存中保留一组 "seen" 个 ID。 运行内存不足。

  2. 排序和唯一

    首先按 "id" 对文件进行排序(使用稳定排序,因此保留顺序)。然后运行再次遍历文件,只保留最后一条记录。这就像通常的 unix sort | uniq 方法。这里的排序很昂贵,而且可能工作量太大。

  3. 提取偏移量和长度信息

    从文件中提取偏移量和长度信息以及id,例如

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

并找出哪些记录属于压缩集。然后查找并通读该文件。此信息的提取相当快,但数百万次查找和读取以提取记录会减慢此方法的速度。


什么是更好、更快(或最快)的方法?是否有解决此类问题的现有工具?

这个问题可以通过三个步骤解决:

  1. 使用 jq or ldjtab.
  2. 等工具提取有趣的值(加上行号)
  3. 使用 tacsort -u 只保留相关行。
  4. 过滤原始文件并只保留指定的行(像filterline or one a few other approaches这样的工具将过滤文件并只保留某些指定的行)。

整个过程还是比较高效的。第 1 步和第 2 步是可并行化的。第3步可以做成fast.