Come posso memorizzare un valore con più chiavi?

1

Ho bisogno di memorizzare due numeri a 32 bit in un modo che sia rapidamente accessibile e il più efficiente possibile nello spazio di archiviazione. Le mie chiavi sono una combinazione dei due seguenti

values:
port: 0 - 29
vlan: 1 - 4095

struct Dat_s{
    int id;
    int val;
} Dat_t;

Inoltre ho bisogno di pre-allocare tutto lo storage che potrebbe essere occupato nel peggiore dei casi.

È il modo migliore per archiviarlo in una matrice bidimensionale mi piace: Dat_t Content[29][4094] ? O c'è un modo migliore?

    
posta cerr 04.04.2017 - 05:45
fonte

2 risposte

1

Per molte attività di programmazione c'è spesso un compromesso tra velocità e memoria. Nel tuo caso, puoi probabilmente accelerare le cose se una delle dimensioni dell'array viene arrotondata alla successiva potenza maggiore di 2. Ciò diventa chiaro quando si utilizza una matrice monodimensionale per la memorizzazione e si esegue il calcolo dell'indirizzo da soli.

Per semplicità, supponiamo che vlan sia compreso nell'intervallo 0 ... 4094 e guardi questo esempio (pseudo codice):

Dat_t getContent(port,vlan) 
{
    return Content[port * MAXVLAN + vlan];
    // or
    return Content[vlan * MAXPORT + port];
}

Se MAXVLAN o MAXPORT è una potenza di due, la moltiplicazione è solo un'operazione di spostamento, che è tipicamente più veloce sulla maggior parte delle architetture di processore contemporanee rispetto a una moltiplicazione con un numero arbitrario. Quindi puoi scegliere MAXVLAN=4096 o MAXPORT=32 (e sprecare alcune voci nell'array), o MAXVLAN=4095 o MAXPORT=30 (che è efficiente in termini di memoria, ma spreca alcuni cicli della CPU). Quindi scegli la tua scelta.

    
risposta data 04.04.2017 - 08:54
fonte
1

Che cosa intendete esattamente per "rapidamente accessibile", in numero di istruzioni per la vostra macchina target? Il calcolo dell'indirizzo di una cella in una matrice bidimensionale implica 2 aggiunte e 1 moltiplicazione. Un hash molto di più (e non sono sicuro che tu possa preallocare la memoria).

Qual è il tuo "caso peggiore"?

Se la tua matrice tende ad essere sparsa in una dimensione (per esempio, la maggior parte delle porte sono usate per un piccolo (diciamo 100) numero di vlan), potresti assegnare una matrice [100] [29] per i Dat_s e una [4096] array contenente indici nella matrice [100] [29], quindi gestisce l'assegnazione dei 100 indici alle 4096 vlan.

    
risposta data 04.04.2017 - 08:21
fonte

Leggi altre domande sui tag