Time-based list in java

icebreaker90

Utente Èlite
5,469
1,255
Hardware Utente
CPU
Intel i7-4790
Scheda Madre
Ga-h97m-d3h
Hard Disk
Western Digital Blu 1TB + Samsung 850 EVO 250GB
RAM
G.skill TridentX 16GB 1600
Scheda Video
Asus Strix GTX 970
Scheda Audio
Asus Xonar U7 + SuperLux HMC 681 Evo
Monitor
Dell P2414H
Alimentatore
Evga Supernova GS 650W
Case
Obsidian 350D
Sistema Operativo
Windows 10 (only gaming) + ArchLinux (everything else)
Ciao ragazzi, vi spiego la mia situazione.
Ho un software in cui arrivano dati da vari sensori.
Supponiamo che, ad un certo punto, venga generato un evento che dovrà essere monitorato.
Per essere studiato, bisogna salvare i dati provenienti dai sensori 30 secondi prima la registrazione dell'evento.

Ora, io ho tutte le classi che mi servono, ma siccome il software sarà operativo 24/7, bisogna che non sia memory-intensive.
Pertanto sto valutando una qualche struttura che mi consenta di salvare solo 30 secondi o un minuto di dati andando quindi ad eliminare automaticmente i dati più vecchi.
Purtroppo sembra non esserci nulla al di fuori delle HashMap messe a disposizione da Guava ( CacheBuilder (Guava: Google Core Libraries for Java 19.0-SNAPSHOT API) )
Il problema è che quella è una hashmap sostanzialmente quindi salva i dati in tuple <chiave,valore> cosa che per me non va bene perchè io devo salvare una serie di double ad esempio.

Qualche idea? Grazie.
 

1nd33d

Utente Attivo
653
279
Hardware Utente
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
Hard Disk
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
Scheda Video
XFX RX480 GTR Black Edition
Scheda Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
Alimentatore
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
Sistema Operativo
Windows 10 64bit - Linux Mint 18
Forse non riesco a comprendere il problema, ma... una normale lista FIFO? Aggiungi in testa e rimuovi in coda ad ogni input dei sensori, per cui hai una struttura dati di dimensione costante nel tempo (o comunque proporzionale alla frequenza di lettura dei sensori). Ad ogni inserimento in testa controlli se l'oggetto in coda è più vecchio di 30 secondi, nel qual caso lo rimuovi.
Quando arriva l'evento leggi l'intera struttura (escludendo eventuali valori in coda troppo vecchi) e fai i calcoli che devi fare.
 
  • Mi piace
Reactions: over_coder

icebreaker90

Utente Èlite
5,469
1,255
Hardware Utente
CPU
Intel i7-4790
Scheda Madre
Ga-h97m-d3h
Hard Disk
Western Digital Blu 1TB + Samsung 850 EVO 250GB
RAM
G.skill TridentX 16GB 1600
Scheda Video
Asus Strix GTX 970
Scheda Audio
Asus Xonar U7 + SuperLux HMC 681 Evo
Monitor
Dell P2414H
Alimentatore
Evga Supernova GS 650W
Case
Obsidian 350D
Sistema Operativo
Windows 10 (only gaming) + ArchLinux (everything else)
Forse non riesco a comprendere il problema, ma... una normale lista FIFO? Aggiungi in testa e rimuovi in coda ad ogni input dei sensori, per cui hai una struttura dati di dimensione costante nel tempo (o comunque proporzionale alla frequenza di lettura dei sensori). Ad ogni inserimento in testa controlli se l'oggetto in coda è più vecchio di 30 secondi, nel qual caso lo rimuovi.
Quando arriva l'evento leggi l'intera struttura (escludendo eventuali valori in coda troppo vecchi) e fai i calcoli che devi fare.
Si alla fine mi sa che farò cosi, ma volevo sapere se c'èra qualcosa di già pronto tipo appunto su guava.
più che altro perchè se arrivano molti dati insieme, qualora la struttura dovesse essere grande, mi porta via tempo computazionale.
La struttura di guava mi piaceva parecchio anche perchè ha una complessità accettabile...
Grazie ugualmente ;)
 

1nd33d

Utente Attivo
653
279
Hardware Utente
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
Hard Disk
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
Scheda Video
XFX RX480 GTR Black Edition
Scheda Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
Alimentatore
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
Sistema Operativo
Windows 10 64bit - Linux Mint 18
Si alla fine mi sa che farò cosi, ma volevo sapere se c'èra qualcosa di già pronto tipo appunto su guava.
più che altro perchè se arrivano molti dati insieme, qualora la struttura dovesse essere grande, mi porta via tempo computazionale.
La struttura di guava mi piaceva parecchio anche perchè ha una complessità accettabile...
Grazie ugualmente ;)
Java, librerie standard https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html
Add (in coda) e Remove (in testa) hanno complessità costante, è più veloce di una hashmap e per quello che devi fare va bene perchè se inserisci in ordine temporale, puoi anche prelevare nello stesso ordine. La hashmap in questo caso oltre ad essere meno performante, risulta pure scomoda.
La quantità di dati non vedo come possa influire... alla fin fine i tuoi dati saranno sempre e comunque degli oggetti che inserirari e preleverai, indipendentemente dalla struttura che usi (alla fin fine stai copiando "puntatori").
 

icebreaker90

Utente Èlite
5,469
1,255
Hardware Utente
CPU
Intel i7-4790
Scheda Madre
Ga-h97m-d3h
Hard Disk
Western Digital Blu 1TB + Samsung 850 EVO 250GB
RAM
G.skill TridentX 16GB 1600
Scheda Video
Asus Strix GTX 970
Scheda Audio
Asus Xonar U7 + SuperLux HMC 681 Evo
Monitor
Dell P2414H
Alimentatore
Evga Supernova GS 650W
Case
Obsidian 350D
Sistema Operativo
Windows 10 (only gaming) + ArchLinux (everything else)
Java, librerie standard https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html
Add (in coda) e Remove (in testa) hanno complessità costante, è più veloce di una hashmap e per quello che devi fare va bene perchè se inserisci in ordine temporale, puoi anche prelevare nello stesso ordine. La hashmap in questo caso oltre ad essere meno performante, risulta pure scomoda.
La quantità di dati non vedo come possa influire... alla fin fine i tuoi dati saranno sempre e comunque degli oggetti che inserirari e preleverai, indipendentemente dalla struttura che usi (alla fin fine stai copiando "puntatori").
E' una soluzione. Però il mio dubbio è che se io tolgo l'elemento in testa per valutare la validità temporale, poi lo dovrò rimettere il coda perchè per "averlo" lo devo rimuovere. Sbaglio?
 

1nd33d

Utente Attivo
653
279
Hardware Utente
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
Hard Disk
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
Scheda Video
XFX RX480 GTR Black Edition
Scheda Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
Alimentatore
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
Sistema Operativo
Windows 10 64bit - Linux Mint 18
E' una soluzione. Però il mio dubbio è che se io tolgo l'elemento in testa per valutare la validità temporale, poi lo dovrò rimettere il coda perchè per "averlo" lo devo rimuovere. Sbaglio?
Se guardi la documentazione che ti ho linkato (la doc di Java è veramente ben fatta) noterai che ci sono più metodi per estrarre un oggetto. Superficialmente ti ho indicato un generico metodo "remove" nel post precedente, quel metodo esiste ma non fa quello che ti ho scritto sopra, bensì permette di estrarre dalla struttura uno specifico elemento ovunque esso si trovi, non è O(1).
Ora, ovviamente questo metodo è "accessorio" nel senso che in una coda tipicamente accedi solo alla testa per estrarre e alla coda per inserire, e i metodi che a te interessano solo proprio quelli che accedono proprio a testa e coda.
Per l'inserimento usi il metodo add , per rimuovere usi il metodo poll . Esiste però un altro metodo peek che permette di ottenere l'elemento in testa senza rimuoverlo. Quindi puoi valutare la validità temporale dell'elemento in testa senza rimuoverlo dalla coda.
Se volessi avere ancora maggior controllo sulla struttura dati, puoi usare una ListaConcatenata https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
 

icebreaker90

Utente Èlite
5,469
1,255
Hardware Utente
CPU
Intel i7-4790
Scheda Madre
Ga-h97m-d3h
Hard Disk
Western Digital Blu 1TB + Samsung 850 EVO 250GB
RAM
G.skill TridentX 16GB 1600
Scheda Video
Asus Strix GTX 970
Scheda Audio
Asus Xonar U7 + SuperLux HMC 681 Evo
Monitor
Dell P2414H
Alimentatore
Evga Supernova GS 650W
Case
Obsidian 350D
Sistema Operativo
Windows 10 (only gaming) + ArchLinux (everything else)
Se guardi la documentazione che ti ho linkato (la doc di Java è veramente ben fatta) noterai che ci sono più metodi per estrarre un oggetto. Superficialmente ti ho indicato un generico metodo "remove" nel post precedente, quel metodo esiste ma non fa quello che ti ho scritto sopra, bensì permette di estrarre dalla struttura uno specifico elemento ovunque esso si trovi, non è O(1).
Ora, ovviamente questo metodo è "accessorio" nel senso che in una coda tipicamente accedi solo alla testa per estrarre e alla coda per inserire, e i metodi che a te interessano solo proprio quelli che accedono proprio a testa e coda.
Per l'inserimento usi il metodo add , per rimuovere usi il metodo poll . Esiste però un altro metodo peek che permette di ottenere l'elemento in testa senza rimuoverlo. Quindi puoi valutare la validità temporale dell'elemento in testa senza rimuoverlo dalla coda.
Se volessi avere ancora maggior controllo sulla struttura dati, puoi usare una ListaConcatenata https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
Il metodo peek non l'avevo proprio visto :/

Ti ringrazio molto!
 

Entra

oppure Accedi utilizzando