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

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

  1. 使用jqldjtab等工具提取有趣的值(加上行号)。
  2. 使用tacsort -u仅保留相关行。
  3. 过滤原始文件并仅保留指定的行(诸如filterline其他一些方法之类的工具将过滤文件并仅保留某些指定的行)。

整个过程非常高效。第 1 步和第 2 步是可并行的。第3步可以做的很快

于 2015-06-19T15:53:41.510 回答