Esiste un nome per una struttura / concetto di dati in cui vengono caricate determinate regioni di un set di dati?

4

Al lavoro mi sto occupando di una situazione in cui disponiamo di una grande quantità di dati di serie temporali e dobbiamo visualizzarne sezioni per l'utente alla volta. I dati hanno essenzialmente un numero infinito di record e quindi non è possibile che il client carichi l'intero set di dati contemporaneamente. Tuttavia, la chiamata dell'API per richiedere sezioni di dati è lenta / costosa, quindi desidero memorizzare nella cache il client di dati già caricato e non doverlo ri-richiedere.

Un'analogia sarebbe quando guardi un video online e salta avanti e indietro. Il player scarica frammenti del video in base a ciò che l'utente sta attualmente cercando di guardare e li memorizza nel caso in cui l'utente guardi di nuovo quel segmento.

Tuttavia ci sono alcune differenze tra il mio caso d'uso e l'esempio del video:

  • Il mio set di dati è scarso. Ci possono essere regioni di diverse settimane senza punti di dati in esse. Devo differenziare tra "nessun dato" e "non caricato".

  • Il mio set di dati non ha segmenti discreti. In un video HLS o DASH il flusso viene suddiviso in segmenti (in genere lunghi 10 secondi) che forniscono intervalli discreti in cui deve avvenire il caricamento. I miei dati possono essere caricati tra due punti qualsiasi nel tempo e, poiché l'utente può ingrandire o ridurre i dati, la distanza tra questi punti potrebbe non essere uguale.

  • Il mio set di dati non è limitato. In un video, c'è un inizio e una fine chiari al video. Nel mio set di dati, puoi andare avanti e indietro teoricamente all'infinito. (Anche se in pratica la lunghezza è limitata da quali date possono essere memorizzate nel nostro back-end, è ancora molto tempo)

Sono autodidatta nella programmazione e non conosco il nome di questo concetto, ma sento che deve essercene uno. Sono in grado di implementare ciò di cui ho bisogno, ma spero di evitare di reinventare la ruota.

    
posta Joshua Walsh 11.01.2018 - 00:34
fonte

2 risposte

1

Se non fosse per la mancanza di sezioni discrete penserei a questo come un algoritmo di caching / sostituzione delle pagine. Solo perché il tuo utente seleziona un intervallo arbitrario non significa necessariamente che non puoi ancora recuperare il set di pagine che contengono quell'intervallo giusto? Le righe del tuo set di dati hanno un ID autoincrementante? se è così allora puoi facilmente suddividere i tuoi dati in pagine costituite da un numero fisso di record. Per recuperare le pagine che contengono i tuoi dati puoi semplicemente usare l'aritmetica modulare, cioè cercare l'id poi fare (id mod n) dove n è la dimensione della pagina per ottenere il primo record della pagina contenente e fare (id mod n) + n per la pagina alla fine dell'intervallo. Se i tuoi dati non hanno questo, allora potenzialmente puoi generare storicamente i numeri e generarli automaticamente da ora in poi?

link

Id considera anche l'utilizzo di un qualche tipo di libreria. Non sei sicuro della tua lingua, ma una rapida ricerca mostra questo interessante progetto che puoi usare come riferimento:

link

    
risposta data 11.01.2018 - 00:52
fonte
-1

Non è sicuro se questo è ciò che stai già considerando: ma riflettendo, dato il tuo caso d'uso, puoi probabilmente ottenere molti benefici da un algoritmo di caching molto semplice, in cui mantieni un singolo segmento di lunghezza variabile nella cache. Quando si superano i limiti a sinistra oa destra, si aumenta semplicemente il segmento in base alla quantità richiesta (preferibilmente più volte la quantità richiesta per evitare ulteriori richieste). Allo stesso modo, se si riduce lo zoom, si espandono entrambe le estremità del segmento. Lo zoom in, ovviamente non richiede che il segmento cambi. Probabilmente dovresti limitare la dimensione massima del segmento, a quel punto se ti sposti a sinistra, perdi una sezione corrispondente dall'estremità destra e viceversa. Passare a un segmento completamente diverso dovrebbe mantenere i dati dall'intersezione con il segmento precedente e scartare i dati al di fuori del nuovo segmento. Per questa implementazione è probabilmente necessario un elenco a doppio accesso implementato in modo efficiente ( link ).

Un caso d'uso in cui questo non funziona bene è quando l'utente passa da due segmenti disgiunti che superano le dimensioni della dimensione massima del segmento o se si spostano in diverse regioni di dati localizzate in remoto.

Sfortunatamente, non conosco lo stesso per un tale algoritmo ...

Un altro pensiero da tenere a mente è quello di essere sicuri al 100% dove si trova il collo di bottiglia. Sei sicuro che non sia il datatable o la query che è male ottimizzata (ad esempio gli indici). Potrebbe essere che il database sia dotato di risorse insufficienti, o che la velocità di marshalling della grande quantità di dati, o il modo in cui i dati vengono caricati in oggetti javascript sia inefficiente, o altre cose come la latenza del round-trip della rete. / p>     

risposta data 11.01.2018 - 08:40
fonte

Leggi altre domande sui tag