Sono un programmatore hobbista; mai lavorato professionalmente Non sto cercando nessuno per scrivere codice per me, ma ho bisogno di sapere come affrontare questo problema e, forse, idee per ulteriori ricerche. Questo problema è una conseguenza del progetto scientifico di mio figlio con cui ho voluto giocare.
La linea di fondo è: ho un sensore che alimenta oggetti dati a intervalli irregolari e imprevedibili (temperatura, pressione dell'aria, altre cose). Ogni nuovo "aggiornamento" alimenta un altro oggetto dati con tutte le informazioni pertinenti ... e ogni oggetto ha un timestamp. L'imprevedibilità è il nocciolo del problema e questo non cambierà. Poiché il mio codice raccoglie nuovi oggetti di dati a intervalli irregolari, ho bisogno di eseguire semplici operazioni aritmetiche sugli oggetti dati per gli ultimi n minuti. Devo eseguire queste operazioni aritmetiche in modo continuo su ogni nuovo "aggiornamento" di nuovi dati. Il sensore potrebbe emettere fino a 20 aggiornamenti al secondo ... o meno. L'utilizzo della CPU e della RAM è un problema delicato, ma voglio concentrarmi sul primo approccio al design operativo.
All'inizio pensavo a array o coda circolare, ma non va bene dato che non so quanti oggetti copriranno gli ultimi n minuti.
Successivamente, ho considerato una lista doppiamente collegata. Il problema con questo approccio è che dovrà consumare una CPU pesante ripetendo sull'intero elenco ogni nuovo "aggiornamento" al fine di rimuovere gli oggetti obsoleti dalla lista o dovrà consumare molta ram se non rimuovo i vecchi oggetti dalla lista ogni volta.
Mi chiedo quali schemi di progettazione (e strutture dati) possano soddisfare questo problema e quali altri elementi posso ricercare per saperne di più per risolvere questo problema.
Capisco che non sto dando molte informazioni qui, ma voglio rimanere semplice e credo di aver dato il succo del problema.
Apprezzo davvero qualsiasi aiuto. A proposito, sto usando C # e CLR per ora. Python potrebbe essere un'opzione migliore poiché questa è data-science'ish. Credo di poter scrivere e / o consumare una libreria / classe Python. Non sono molto fluente con Python.
UPDATE - 8/30
Ho pensato in risposta alle risposte di tutti - che sono grandi e apprezzo molto.
Sto pensando, utilizzare la classe ConcurrentQueue dalla libreria .NET come struttura dati principale. Non sapevo che fosse ridimensionabile fino a quando @amon non l'ha menzionato. Una coda sembra perfetta perché posso scorrere dalla coda della coda e dare un'occhiata al prossimo timestamp, usando un ciclo while (cioè, mentre il prossimo "peek" è al di fuori della n -minute time window allora dequeue). Poiché tutti gli oggetti dati devono necessariamente essere accodati in ordine temporale, questo dovrebbe funzionare se la testa è sempre la più vecchia e coda è sempre l'oggetto dati più recente. Ciò attenua la mia preoccupazione per l'utilizzo della CPU nel mantenere la coda "corrente" (cioè, contenente solo oggetti dati all'interno della finestra temporale n ).
Riguardo all'aggiornamento della vista dell'utente e al mitigamento dell'uso della CPU, potrei aggiornare la vista ogni x secondi come menzionato da @JohnWu. Probabilmente userò un Timer per Thread che aggiornerebbe gli oggetti dati sottostanti la vista dell'utente su un thread separato a intervalli fissi.
Se questo usa troppa CPU, indagherò sul salvataggio di pezzi di stato come discusso da @ErikEidt. Ma dal momento che non sto calcolando solo le medie, sarà un po 'complicato. Spero che quanto sopra abbia a che fare con problemi di risorse.
Volevo solo dire grazie per l'intuizione.
Il prossimo passo è imparare di più sul threading.