Ich muss einige sehr große Mengen von Zeitreihendaten speichern und abfragen können.
Eigenschaften der Daten sind wie folgt:
- Anzahl der Serien: rund 12.000 (zwölftausend)
- Anzahl Datenpunkte, weltweit: rund 500.000.000 pro Monat (fünfhundert Millionen)
- Mischwerttypen: Die Mehrheit der Datenpunkte sind Gleitkommawerte, der Rest sind Zeichenfolgen
- Abtastperiode: variabel zwischen Serien sowie innerhalb einer Serie
- Zeitstempel: Millisekundengenauigkeit
- Datenaufbewahrungsdauer: mehrere Jahre, ohne Zerfall oder Downsampling
- Datenarchive müssen nahezu in Echtzeit erstellt werden, eine angemessene Verzögerung (~ 1 Stunde) ist jedoch akzeptabel
- Vergangene Daten können bei Bedarf zu hohen Kosten wiederhergestellt werden
- Manchmal, aber sehr selten, müssen einige frühere Daten aktualisiert werden
Eigenschaften der geplanten Abfragen:
- Bei den meisten Abfragen zu den Daten handelt es sich um zeitstempelbasierte Abfragen. von einem Tag bis zu mehreren Monaten / Jahren. Über 90% werden die neuesten Daten abgefragt
Andere Vorraussetzungen:
- Die Lösung muss frei sein wie im Freibier und vorzugsweise Open Source
Mein erster Gedanke war, PyTables / Pandas mit HDF5-Dateien als Speicher für das Backend anstelle einer SQL-Datenbank zu verwenden.
Fragen :
Angenommen, PyTables / Pandas ist die "beste" Route. Wäre es besser, die Daten in mehrere HDF-Dateien zu unterteilen, die sich jeweils über einen bestimmten Zeitraum erstrecken, oder alles in eine einzige Datei zu packen, die dann riesig werden würde?
Soll ich das feste oder das Tabellenformat bevorzugen? Für mich sieht das feste Format in Ordnung aus, wenn ich eine HDF-Datei pro Monat behalte, da auf diese Weise wahrscheinlich eine ganze Reihe in den Arbeitsspeicher passt und ich den Arbeitsspeicher in Scheiben schneiden kann, ohne einen Tabellenformatindex zu benötigen. Hab ich recht ?
Und wenn dies nicht der beste Ansatz ist, wie sollte ich diesen Datenspeicher strukturieren oder welche Technologien sollte ich in Betracht ziehen? Ich bin nicht der erste, der sich mit dem Speichern großer Mengen von Zeitreihendaten befasst. Wie wird diese Herausforderung im Allgemeinen gelöst?
Andere Ansätze, die ich in Betracht gezogen habe:
- Array-Datenbanken: Sie eignen sich hervorragend für Zeitreihen mit konstanter Abtastperiode, da Sie dann nur Start- und Endzeit sowie Abtastperiode des Arrays speichern müssen und dann nur Werte im Array selbst und die Indizierung einfach ist. Aber mit variablen Abtastperioden innerhalb der Serien selbst muss ich ein engeres Zeitstempel-Wert-Verhältnis beibehalten, das meiner Ansicht nach nicht so gut für Array-DBMS geeignet ist.
- Standard-SQL-Datenbank mit Zeitstempel, Parameter-ID und Wert als Spalten, aber aufgrund ihrer Art fordern sie für jede Abfrage eine Menge Festplatten-E / A an