Pandy HDF5 jako baza danych

Używam Pythona pandas przez ostatni rok i jestem pod wrażeniem jego wydajności i funkcjonalności, jednak pandas nie jest jeszcze bazą danych. Ostatnio zastanawiałem się nad sposobami zintegrowania mocy analizy pand z płaską bazą plików HDF5. Niestety HDF5 nie jest zaprojektowany do natywnego radzenia sobie z współbieżnością.

Szukałem inspiracji w systemach blokowania, rozproszonych kolejkach zadań, równoległych HDF5, menedżerach baz danych plików płaskich lub wieloprocesorowych ale nadal nie mam jasnego pojęcia, od czego zacząć.

Ostatecznie chciałbym mieć RESTful API do interakcji z plikiem HDF5 w celu tworzenia, pobierania, aktualizacji i usuwania danych. Możliwym przypadkiem użycia tego rozwiązania może być zbudowanie magazynu szeregów czasowych, w którym czujniki mogą zapisywać dane, a usługi analityczne mogą być realizowane na jego szczycie.

Wszelkie pomysły na możliwe ścieżki do naśladowania, istniejące podobne projekty lub o wygody / niedogodności całego pomysłu będą bardzo doceniam to.

PD: wiem, że mogę użyć bazy danych SQL/NoSQL do przechowywania danych, ale chcę użyć HDF5, ponieważ nie widziałem nic szybszego, jeśli chodzi o pobieranie dużych ilości danych.

Author: MonkeyButter, 2014-03-20

3 answers

HDF5 działa dobrze dla równoczesnego dostępu tylko do odczytu.
Aby uzyskać dostęp do zapisu równoległego, musisz użyć parallel HDF5 lub mieć proces worker, który zajmuje się zapisem do magazynu HDF5.

Istnieją pewne próby połączenia HDF5 z RESTful API z grupy HDF intself. Zobacz Tutaj i tutaj Po Więcej Szczegółów. Nie wiem, czy jest dojrzały.

Zalecam użycie podejścia hybrydowego i udostępnienie go przez RESTful API.
Możesz przechowywać meta-informacje w bazie danych SQL / NoSQL i przechowywać surowe dane (dane szeregów czasowych) w jednym lub wielu plikach HDF5.

Istnieje jeden publiczny REST API, aby uzyskać dostęp do danych i użytkownik nie musi przejmować się tym, co dzieje się za zasłoną.
To jest również podejście, które przyjmujemy do przechowywania informacji biologicznych.

 10
Author: Ümit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 11:58:42

Wiem, że poniższe nie jest dobrą odpowiedzią na pytanie, ale jest idealne dla moich potrzeb i nie znalazłem go zaimplementowanego gdzie indziej:

from pandas import HDFStore
import os
import time

class SafeHDFStore(HDFStore):
    def __init__(self, *args, **kwargs):
        probe_interval = kwargs.pop("probe_interval", 1)
        self._lock = "%s.lock" % args[0]
        while True:
            try:
                self._flock = os.open(self._lock, os.O_CREAT |
                                                  os.O_EXCL |
                                                  os.O_WRONLY)
                break
            except FileExistsError:
                time.sleep(probe_interval)

        HDFStore.__init__(self, *args, **kwargs)

    def __exit__(self, *args, **kwargs):
        HDFStore.__exit__(self, *args, **kwargs)
        os.close(self._flock)
        os.remove(self._lock)

Używam tego jako

result = do_long_operations()
with SafeHDFStore('example.hdf') as store:
    # Only put inside this block the code which operates on the store
    store['result'] = result

I różne procesy / wątki działające na tym samym sklepie będą po prostu w kolejce.

Zauważ, że jeśli zamiast tego naiwnie operujesz na sklepie z wielu procesów, Ostatnie zamknięcie sklepu "wygra", a to, co inni "myślą, że napisali", zostanie utracone.

(I know I could instead po prostu pozwól jednemu procesowi zarządzać wszystkimi zapisami, ale to rozwiązanie pozwala uniknąć kosztów wytrawiania)

EDIT: "probe_interval" może być teraz dostrojony (jedna sekunda to za dużo, jeśli zapisy są częste)

 7
Author: Pietro Battiston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-19 10:26:58

Grupa HDF ma już usługę REST dla HDF5: http://hdfgroup.org/projects/hdfserver/

 3
Author: John Readey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-02 15:16:19