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% 的记录可以丢弃。
我尝试了各种方法:
已查看 ID
在内存中保留一组 "seen" 个 ID。 运行内存不足。
排序和唯一
首先按 "id" 对文件进行排序(使用稳定排序,因此保留顺序)。然后运行再次遍历文件,只保留最后一条记录。这就像通常的 unix sort | uniq
方法。这里的排序很昂贵,而且可能工作量太大。
提取偏移量和长度信息
从文件中提取偏移量和长度信息以及id,例如
id offset length
1 0 27
2 27 25
3 52 25
1 77 26
并找出哪些记录属于压缩集。然后查找并通读该文件。此信息的提取相当快,但数百万次查找和读取以提取记录会减慢此方法的速度。
什么是更好、更快(或最快)的方法?是否有解决此类问题的现有工具?
这个问题可以通过三个步骤解决:
- 使用 jq or ldjtab.
等工具提取有趣的值(加上行号)
- 使用
tac
和 sort -u
只保留相关行。
- 过滤原始文件并只保留指定的行(像filterline or one a few other approaches这样的工具将过滤文件并只保留某些指定的行)。
整个过程还是比较高效的。第 1 步和第 2 步是可并行化的。第3步可以做成fast.
给定一个包含行分隔 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
在内存中保留一组 "seen" 个 ID。 运行内存不足。
排序和唯一
首先按 "id" 对文件进行排序(使用稳定排序,因此保留顺序)。然后运行再次遍历文件,只保留最后一条记录。这就像通常的 unix
sort | uniq
方法。这里的排序很昂贵,而且可能工作量太大。提取偏移量和长度信息
从文件中提取偏移量和长度信息以及id,例如
id offset length 1 0 27 2 27 25 3 52 25 1 77 26
并找出哪些记录属于压缩集。然后查找并通读该文件。此信息的提取相当快,但数百万次查找和读取以提取记录会减慢此方法的速度。
什么是更好、更快(或最快)的方法?是否有解决此类问题的现有工具?
这个问题可以通过三个步骤解决:
- 使用 jq or ldjtab. 等工具提取有趣的值(加上行号)
- 使用
tac
和sort -u
只保留相关行。 - 过滤原始文件并只保留指定的行(像filterline or one a few other approaches这样的工具将过滤文件并只保留某些指定的行)。
整个过程还是比较高效的。第 1 步和第 2 步是可并行化的。第3步可以做成fast.