JSON日志文件压缩

JSON日志文件压缩,json,filter,unique,stream-compaction,Json,Filter,Unique,Stream 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": 2

给定一个包含行分隔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
    
  • 然后找出哪些记录属于压缩集。然后查找并阅读文件。提取这些信息的速度相当快,但是数以百万计的查找和读取来提取记录会减慢这种方法的速度



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

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

  • 使用或之类的工具提取感兴趣的值(加上行号)
  • 使用
    tac
    sort-u
    仅保留相关行
  • 过滤原始文件并仅保留指定行(类似于或one a的工具将过滤文件并仅保留某些指定行)

  • 整个过程相当高效。步骤1和2是可并行的。第3步可以完成。

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

  • 使用或之类的工具提取感兴趣的值(加上行号)
  • 使用
    tac
    sort-u
    仅保留相关行
  • 过滤原始文件并仅保留指定行(类似于或one a的工具将过滤文件并仅保留某些指定行)

  • 整个过程相当高效。步骤1和2是可并行的。第3步可以进行。

    压缩应该使用哪种语言?@BerndLinde,任何语言都不重要。我更感兴趣的是一种通用的方法或现有的工具。对压缩应该使用哪种语言有任何偏好吗?@BerndLinde,没有任何语言是无关紧要的。我更感兴趣的是一种通用的方法或现有的工具。对压缩应该使用哪种语言有任何偏好吗?@BerndLinde,没有任何语言是无关紧要的。我对通用方法或现有工具更感兴趣。