基于行的内容交织来自多个文件的文本

时间:2016-04-06 22:18:13

标签: optimization io text-processing

我正在尝试使用N个文件,顺便提一下,这些文件都是系统日志文件,并根据时间戳(行的第一部分)进行交错。我可以天真地做到这一点,但我担心我的方法不会只有少数这些文件很好地扩展。

所以我想说我只有两个文件1.log2.log1.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:]

我担心这可能会很慢,像这样逐行阅读。但是,我不知道怎么做。我可以使用不同的算法或并行化更快地执行此任务吗?我对使用哪种语言和工具漠不关心。

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