我正在尝试使用N个文件,顺便提一下,这些文件都是系统日志文件,并根据时间戳(行的第一部分)进行交错。我可以天真地做到这一点,但我担心我的方法不会只有少数这些文件很好地扩展。
所以我想说我只有两个文件1.log
和2.log
。 1.log
看起来像这样:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.384521+00:00 bar 1
和2.log
看起来像这样:
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
鉴于这个例子,我希望输出为:
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1
因为那将是文件的行,组合,并按每行开始的时间戳排序。
我们可以假设每个文件在程序运行之前都在内部排序。 (如果不是,rsyslog和我有话要说。)
如此天真,我可以写出这样的东西,忽略记忆问题和诸如此类的东西:
interlaced_lines = []
first_lines = [[f.readline(), f] for f in files]
while first_lines:
first_lines.sort()
oldest_line, f = first_lines[0]
while oldest_line and (len(first_lines) == 1 or (first_lines[1][0] and oldest_line < first_lines[1][0])):
interlaced_lines.append(oldest_line)
oldest_line = f.readline()
if oldest_line:
first_lines[0][0] = oldest_line
else:
first_lines = first_lines[1:]
我担心这可能会很慢,像这样逐行阅读。但是,我不知道怎么做。我可以使用不同的算法或并行化更快地执行此任务吗?我对使用哪种语言和工具漠不关心。
答案 0 :(得分:0)
事实证明,由于每个文件都是内部预先排序的,因此我可以使用sort --merge
。超过2GB的日志,它在15秒内排序。用我的例子:
% sort --merge 1.log 2.log
2016-04-06T21:13:23.655446+00:00 foo 1
2016-04-06T21:13:24.372946+00:00 foo 2
2016-04-06T21:13:24.373171+00:00 bar 2
2016-04-06T21:13:24.384521+00:00 bar 1