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

  • From: Daniele Nicolodi <daniele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Fri, 19 Mar 2021 09:23:40 +0100

On 19/03/2021 08:43, Emanuele Olivetti wrote:

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.

Ciao Emanuele,

credo che la complessità della soluzione non dipenda principalmente dal
rate a cui devi inserire i dati ma da quali funzionalità il data storage
deve avere.

Per esempio, io ho un paio di sistemi di acquisizione dati che scrivono
4 canali float64 a 10 Msamples/s su un disco SSD in realtime su un
laptop di qualche anno fa con software scritto tutto in Python senza
particolari accorgimenti (ma nemmeno nel modo più stupido).

Le soluzioni proposte fino ad adesso danno per scontato che ti serve
accesso remoto ai dati una volta immagazzinati e che tu voglia avere la
possibilità di accedere ad i dati associati ad un singolo timestamp.

Se queste cose non ti servono, scrivere i dati direttamente in file
binari è sicuramente una possibilità. La cosa comoda dei dati
sperimentali è che la chiave di accesso di gran lunga più comune è il
timestamp e che questo è naturalmente monotonico e spesso incrementato
ad intervalli regolari o pseudo-regolari. Per questa ragione
semplicemente scrivere i dati in file binari che vengono rotati quando
raggiungono una data dimensione (determinata principalmente dai pattern
di accesso ai dati che prevedi utilizzerai) non è per nulla una brutta
soluzione.

Tra le altre cose, questa soluzione funziona bene se hai un processo che
scrive i dati ed uno o più che li consumano sulla stessa macchina. Se i
processi in lettura sono interessati principalmente ai dati recenti, la
cache del sistema operativo funziona egregiamente per fare in modo che
lo scambio di dati tra i due processi non debba rileggere da disco i
dati che sono stati appena scritti.

Se ti serve un formato di dati strutturato e che permette un minimo di
indicizzazione e di includere metadata dai uno sguardo a HDF5 ed alla
funzionalità chunk write. La documentazione delle module hdf5 per Python
(e anche quella di PyTables, che si basa su HDF5) sono più accessibili
della documentazione di base di HDF5.

Ci sono anche altri formati studiati per questo tipo di funzionalità, ma
non ho ancora avuto modo di lavorarci, ad esempio Apache Parquet.

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


Other related posts: