Halihallo Programmiertechniker
Dieser Thread bezieht sich auf [pref:t=46188&m=252704]. Habe mich entschieden ein
neuer Thread zu starten.
Ich habe eine Apache-Access-Log vorliegen, ca. 2GB gross. Nun gilt es aus dieser Datei
eine neue Datei zu transformieren, welche die _unterschiedlichen_ (aus der Ur-
sprungsdatei extrahierten) IP's abbildet. Erschwerend kommt hinzu, dass die zu
IP's nur von einem bestimmten Zeitfenster extrahiert werden sollen und nur bestimmte
URL's überhaupt interessieren (Request muss geparsed und untersucht werden).
Programmiersprache vorzugsweise C (evtl. Perl).
Frage gleich hier: Wie würdet ihr das möglichst performant umsetzen?
Meine Gedanken:
Die access-log ist per Definition schon nach der Zeit indiziert, nur sind die Datensätze
nicht fixer Länge. Ich dachte mir, dass ich trotz dieses Umstandes die Datei als eine
Datei fixer Datensatzlänge interpretiere und einen Buffer von 32kb anlege. Wenn es nun
darum geht eine bestimmte Zeit zu selektieren, iteriere ich wie in einem B-Baum über
die Datei, untersuche den aktuell eingelesenen Buffer auf Newlines und lese alles danach
in die struct log_entry ein. Falls das extrahierte Datum kleiner als das zu suchende ist,
wird die nächste Hälfte selektiert, die vorherige wenn das Datum grösser ist. So finde
ich in dem access_log in etwa log(n)-Zeit das gewünschte Datum (nicht n/2, wenn ich alle
Daten extrahieren würde). Wenn ich die Position des Start-Entries und des End-Entries
gefunden habe iteriere ich über die eingeschlossenen log-Entries und extrahiere die IP's.
Über ein Look-Back-Array von 10'000 IP's finde ich die unterschiedlichen[1] und
speichere sie in der Ausgabedatei ab.
Meine Frage:
Habt Ihr mir vielleicht Anregungen? - Verbesserungsvorschläge? - Anmerkungen?
[1] mit einigermassen kleiner Fehlerrate, die tolerabel ist. Alles kleiner 5% Fehler ist
für die Aufgabenstellung akzeptabel. Die 5% Fehler bezihen sich auf die extrahierten
IP's von einem Tag. Die 10'000 ist IMHO ausreichend, denn viel mehr werden in einem
Tag gar nicht gespeichert. Mir ist bewusst, dass die IP's nicht staatisch zugewiesen
werden, die IP's werden zu bestimmten Zeiten aufgelöst und somit macht es keinen
Sinn, wenn man mehrmals die selbe IP auflöst, deshalb die Extraktion
unterschiedlicher IP's.
Viele Grüsse
Philipp