【问题标题】:JSON log file compactionJSON 日志文件压缩
【发布时间】:2015-08-15 00:42:56
【问题描述】:

给定一个带有行分隔 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”对文件进行排序(使用稳定的排序,因此保留顺序)。然后再次运行文件,只保留最后一条记录。这就像通常的 unix sort | uniq 方法。在这里排序很昂贵,而且可能工作量太大。

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

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

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

并找出哪些记录属于压缩集。然后查找并阅读该文件。提取这些信息的速度相当快,但是为了提取记录而进行的数百万次搜索和读取会减慢这种方法的速度。


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

【问题讨论】:

  • 压缩应该使用哪种语言?
  • @BerndLinde,没有语言无关紧要。我对通用方法或现有工具更感兴趣。

标签: json filter unique stream-compaction


【解决方案1】:

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

  1. 使用jqldjtab 等工具提取有趣的值(加上行号)。
  2. 使用tacsort -u 仅保留相关行。
  3. 过滤原始文件,只保留指定的行(filterlinefew other approaches 之类的工具将过滤文件,只保留某些指定的行)。

整个过程非常高效。第 1 步和第 2 步是可并行的。第三步可以发fast

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2015-06-04
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-10-24
    • 2023-03-13
    相关资源
    最近更新 更多