2016-04-06 3 views
0

Ich versuche, N-Dateien, die übrigens alle Syslog-Protokolldateien sind, und interlace sie basierend auf dem Zeitstempel, der der erste Teil der Zeile ist. Ich kann das naiv machen, aber ich befürchte, dass mein Ansatz nicht mehr als nur eine Handvoll dieser Dateien gut skalieren wird.Interlacing Text aus mehreren Dateien basierend auf dem Inhalt der Zeile

Also sagen wir, ich habe nur zwei Dateien, 1.log und 2.log. 1.log sieht wie folgt aus:

2016-04-06T21:13:23.655446+00:00 foo 1 
2016-04-06T21:13:24.384521+00:00 bar 1 

und 2.log wie folgt aussieht:

2016-04-06T21:13:24.372946+00:00 foo 2 
2016-04-06T21:13:24.373171+00:00 bar 2 

Da Beispiel, ich würde die Ausgabe sein wollen:

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 

Wie, dass die Linien würde der Dateien, kombiniert und sortiert nach dem Zeitstempel, mit dem jede Zeile beginnt.

Wir können davon ausgehen, dass jede Datei intern sortiert wird, bevor das Programm ausgeführt wird. (Wenn es nicht ist, rsyslog und ich habe sprechen einige zu tun.)

So ganz naiv konnte ich so etwas schreiben, Speicher Bedenken zu ignorieren und so weiter:

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:] 

Ich befürchte, dass dies sein könnte ziemlich langsam, Zeile für Zeile so lesen. Ich bin mir aber nicht sicher, wie ich das sonst machen soll. Kann ich diese Aufgabe schneller mit einem anderen Algorithmus oder durch Parallelisierung durchführen? Ich bin weitgehend gleichgültig, welche Sprachen und Werkzeuge zu verwenden sind.

Antwort

0

Wie sich herausstellt, da jede Datei intern vorsortiert ist, kann ich mit sort --merge ziemlich weit kommen. Mit mehr als 2 GB Logs sortiert er sie in 15 Sekunden. Unter Verwendung meines Beispiels:

% 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