Muszę przechowywać i móc wyszukiwać bardzo duże ilości danych szeregów czasowych.
Właściwości danych są następujące:
- liczba serii: około 12.000 (dwanaście tysięcy)
- liczba punktów danych na świecie: około 500 000 000 miesięcznie (pięćset milionów)
- mieszane typy wartości: większość punktów danych to wartości zmiennoprzecinkowe, reszta to łańcuchy
- okres próbkowania: zmienny między seriami, a także w obrębie serii
- znaczniki czasu: precyzja milisekundowa
- okres przechowywania danych: kilka lat, bez rozkładu i próbkowania w dół
- archiwa danych muszą być wbudowane prawie w czasie rzeczywistym, ale rozsądne opóźnienie (~ 1 godzina) jest dopuszczalne
- dane z przeszłości można w razie potrzeby odbudować, ale kosztem
- czasami, ale dość rzadko, niektóre wcześniejsze dane wymagają aktualizacji
Właściwości przewidywanych zapytań:
- większość zapytań dotyczących danych będzie zapytaniami opartymi na znacznikach czasu; od jednego dnia do kilku miesięcy / lat. 90% + to zapytania dotyczące najnowszych danych
Inne wymagania:
- rozwiązanie musi być darmowe, jak w darmowym piwie i najlepiej open source
Moją początkową myślą było użycie PyTables / Pandas z plikami HDF5 do przechowywania backendu zamiast bazy danych SQL.
Pytania :
Zakładając, że PyTables / Pandas jest „najlepszą” trasą, czy lepiej byłoby podzielić dane na kilka plików HDF, z których każdy obejmuje dany okres, czy umieścić wszystko w jednym pliku, który stałby się ogromny?
Czy powinienem wybrać format stały lub tabelowy? Dla mnie ustalony format wygląda OK, jeśli trzymam jeden plik HDF na miesiąc, ponieważ w ten sposób cała seria prawdopodobnie mieści się w pamięci RAM i mogę kroić w pamięci bez potrzeby indeksowania formatu tabeli. Mam rację ?
A jeśli to nie jest najlepsze podejście, jak powinienem ustrukturyzować ten magazyn danych lub jakie technologie powinienem rozważyć? Nie jestem pierwszym, który zajmuje się przechowywaniem dużych zbiorów danych szeregów czasowych, jakie jest ogólne podejście do rozwiązania tego problemu?
Inne podejścia, które rozważałem:
- bazy danych tablic: doskonale nadają się do szeregów czasowych ze stałym okresem próbkowania, ponieważ wystarczy przechowywać czasy rozpoczęcia i zakończenia oraz okres próbkowania tablicy, a następnie tylko wartości w samej tablicy i indeksowanie jest łatwe. Ale ze zmiennymi okresami próbkowania w samych seriach muszę zachować bliższą relację znacznika czasu-> wartość, która moim zdaniem nie jest tak dobrze dopasowana do tablicy DBMS.
- standardowa baza danych SQL z datownikiem, paramID, wartością jako kolumnami, ale ze swej natury żądają dużej ilości dyskowych operacji we / wy dla każdego zapytania