Thread Große Datenmengen im Stream (1 answers)
Opened by biologist at 2008-09-10 17:14

biologist
 2008-09-10 17:14
#114498 #114498
User since
2008-04-25
4 Artikel
BenutzerIn
[default_avatar]
Ich bin momentan mit einem Projekt betreut, bei dem Weblogdaten speziell auf Kundenwünsche ausgewertet werden sollen. Das Ganze ist von der Sortierung relativ komplex. Bislang hatte ich es so gehalten, dass ich die Daten in einem bis zu 12fach geschachtelten Hash (incl. mehrdimensionalen Arrays) vorsortiert und anschließend wieder sortiert (mit Ergebnissen) in eine .txt-Datei geschrieben habe. Die Datenmenge hat sich nun jedoch wesentlich erhöht (Logfiles bis 2,5GB täglich) und somit ist die Sortierung im Speicher nicht mehr so leicht möglich. Aufgrund von mehrdimensionalen Anforderungen in der Sortierung ist es auch nicht möglich die Daten einfach am Anfang (ohne vorige Auswertung) zu splitten.

Lange Rede - kurzer Sinn: ich habe mich nach längerer Überlegung dazu entschlossen (und dies auch schon zum großen Teil realisiert) mir zur Sortierung via DBI eine mysql-db zur Hilfe zu nehmen. Aufgrund von zusätzlichen Schritten ist dies zeitaufwändiger, jedoch hinsichtlich der hohen Datenmenge praktikabler, weil nicht so viel Speicher gebraucht wird.

Das ursprüngliche Logfile wird im ersten Schritt geparst und die notwendigen Elemente in eine mysql-Tabelle geschrieben. Nun müssen die Daten sortiert wieder aus der DB raus, damit ich sie auswerten kann. Möglich wäre dies durch mehrere tausend Queries, was das Ganze aber sehr langsam macht. Daher habe ich mich dazu entschlossen den gesamten Datensatz quasi als Stream aus der DB zu holen und mit Perl auszuwerten. Hier ergibt sich jedoch leider das Problem (um endlich mal auf den Punkt zu kommen), dass das Übergabe-Array sehr viel Speicher benötigt. Immerhin wesentlich weniger als die ursprüngliche Sortierung im Speicher, aber dennoch einiges und ich frage mich, ob man das noch speicherschonender gestalten kann.

Ist es irgendwie möglich die Daten aus der DB nicht in einem großen Array, sondern im Stream mit einem Stack gepuffert zu übergeben, so dass die Speicheranforderungen geringer sind?

View full thread Große Datenmengen im Stream