[Linuxtrent] Re: Salvare serie temporali ad alto flusso con Python

  • From: Emanuele Olivetti <emanuele.olivetti@xxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Fri, 19 Mar 2021 08:43:59 +0100

Grazie a Tutti per le risposte arrivate finora, anche in privato!
Vedo che il problema è molto sentito e che le soluzioni non sono
esattamente minimaliste (Postgres, Timescale, Victoria Metrics ecc.). Ma
capisco che le richieste non siao banali. Ad ulteriore chiarimento, per
commentare l'ultima risposta di Marco, aggiungo che non solo l'insert deve
essere veloce ma mi piacerebbe che anche le query lo fossero, per pensare
in futuro a un'analisi del risultato delle query non dico real-time ma
comunque a stretto giro.

Quello che imparo dalle vostre risposte è - soprattutto - che forse non c'è
una soluzione piccola e semplice a questo problema. A me, già Redis mi
pareva un bel gigante :D

Continuo a leggere con molta attenzione il thread.

Emanuele

On Fri, Mar 19, 2021 at 8:32 AM Marco Ciampa <ciampix@xxxxxxxxxx> wrote:

On Fri, Mar 19, 2021 at 07:24:00AM +0100, Emanuele Olivetti wrote:
Salve a Tutti,

con Python sto cercando di trovare una soluzione semplice e sperabilmente
"minimalista" al problema di salvare su disco i dati provenienti
rapidamente da più insieme di sensori anche per periodi di tempo molto
lunghi.

Mi spiego meglio: ho alcuni gruppi di 4 sensori (gruppo X: S1, S2, S3,
S4)
ciascuno che periodicamente (anche parecchio volte al secondo) mi mandano
la loro lettura tramite un unico websocket. Un messaggio ricevuto di
esempio potrebbe essere: messaggio=('gruppo':1, 'timestamp':123456789,
's1':15, 's2':22, 's3':12, 's4':16)

Io per ora inserisco il messaggio in una coda (queue.Queue()) per essere
certo di non perdermi messaggi e ora sto cercando un contenitore
possibilmente più snello di un database SQL per mettere questi messaggi
da
parte. In futuro avrò bisogno di recuperare questi dati con query tipo
"dammi tutte le letture del gruppo X che hanno un timestamp compreso tra
<timestamp 1> e <timestamp 2>".

Il flusso di dati è piuttosto rapido, tipo un milione di messaggi al
giorno. Il timestamp è un intero che esprime il tempo in millisecondi.
Purtroppo, ci possono essere più letture con lo stesso esatto timestamp
(per vari motivi tecnici). In linea teorica, il flusso dei dati non si
ferma mai e quindi devo essere in grado di fare query anche mentre i dati
vengono ricevuti e stoccati.

Sto iniziando a guardare Redis, che trovo estremamente performante. Ma
sono
agli inizi e non trovo una struttura dati di Redis che sia perfetta per
il
mio caso.

Consigli? Se ci fossero tool/librerie per Python anche più minimaliste di
Redis, sarei contento. Per ora mi accontenterei di avere una soluzione :D

Grazie e a presto,

Emanuele

Mi pare di capire che a te interessa la velocità di insert. Penso che il
tuo problema sia essenzialmente di tuning e che più o meno qualunque DB
SQL, _ben tarato_ ti possa andar bene, dal classico mysql (scegliendo il
db e le opzioni accuratamente) o posgresql. Vedi questo:


https://dba.stackexchange.com/questions/75075/how-do-i-maintain-high-insert-performance-on-postgresql

bye

--

Saluton,
Marco Ciampa
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx



Other related posts: