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

  • From: "Guido Brugnara" <dmarc-noreply@xxxxxxxxxxxxx> (Redacted sender "gdo" for DMARC)
  • To: linuxtrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: Fri, 19 Mar 2021 08:07:01 +0100 (CET)

----- Il 19-mar-21, alle 7:24, Emanuele Olivetti <emanuele.olivetti@xxxxxxxxx> 
ha scritto: 

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

Io utilizzo [ https://www.timescale.com/ ;| https://www.timescale.com/ ] che è ;
poi un modulo di PostgreSQL. 
Con esso hai performance ufficienti per quel che devi fare; il suo limite è di 
circa 1.5M+ di metriche al secondo per server. 
Stoccati i dati (via SQL) poi li puoi estrarre con banali query SQL ma con 
altrettanta velocità perché i dati sono partizionati per timestamp e volendo 
anche per metriche o gruppi di metriche. 

Se poi ti serve un ambiente sofisticato di presentazione/interrogazione puoi 
usare Promscale (Prometheus) , Grafana, ... 

bye 
gdo 

Other related posts: