繁体   English   中英

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; 是否有可与行分隔JSON一起使用的uniq (且速度很快)?


输入文件可能包含10亿条记录,其中可能会丢弃10-20%的记录。

我尝试了各种方法:

  1. 看到的ID

    在内存中保留一组“可见” ID。 这将耗尽内存。

  2. 排序和独特

    首先按“ id”对文件进行排序(使用稳定的排序,因此保留了顺序)。 然后再次运行该文件,并保留最后一条记录。 这就像通常的unix sort | uniq sort | uniq方法。 这里的分类很昂贵,可能工作太多。

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

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

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

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


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

此问题可以通过三步过程解决:

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

整个过程非常有效。 步骤1和2是可并行化的。 第三步可以做得很快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM