Ho una matrice di oggetti (ad esempio, immagini), che è troppo grande per adattarsi alla memoria (ad esempio 40 GB). Ma il mio codice deve essere in grado di accedere in modo casuale a questi oggetti in fase di runtime.Contenitore ad accesso casuale che non si adatta alla memoria?
Qual è il modo migliore per farlo?
Dal punto di vista del mio codice, non dovrebbe essere importante, ovviamente, se alcuni dati sono presenti su disco o temporaneamente memorizzati in memoria; dovrebbe avere accesso trasparente:
container.getObject(1242)->process();
container.getObject(479431)->process();
Ma come devo implementare questo contenitore? Dovrebbe semplicemente inviare le richieste a un database? Se sì, quale sarebbe l'opzione migliore? (Se un database, quindi dovrebbe essere libero e non troppo fastidio amministrativo, forse Berkeley DB o sqlite?)
Devo solo implementarlo da solo, memoizing oggetti dopo aver scaricato la memoria quando è pieno? O ci sono buone librerie (C++) per questo là fuori?
I requisiti per il contenitore consistono nel minimizzare l'accesso al disco (alcuni elementi potrebbero essere utilizzati più frequentemente dal mio codice, quindi dovrebbero essere tenuti in memoria) e consentire un accesso rapido.
UPDATE: mi scopre che STXXL non funziona per il mio problema perché gli oggetti sono Conservare nel contenitore hanno dimensione dinamica, cioè il mio codice può aggiornarli (aumentando o diminuendo la dimensione di alcuni oggetti) in fase di esecuzione. Ma STXXL non può gestire che:
contenitori STXXL per scontato che i dati tipi che immagazzinano sono vecchi dati semplici tipi (POD). http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html
Potresti commentare altre soluzioni? Che ne dici di usare un database? E quale?
Senza sapere di più sul tuo problema, direi entrambi (leggere dal disco e memorizzare nella cache alcuni risultati o utilizzare un database con la memorizzazione nella cache) sono buone soluzioni –
Se stai modificando l'oggetto, non stai creando un nuovo oggetto ? Quindi hai il vecchio e il nuovo oggetto, oppure cancelli il vecchio e lo sostituisci con il nuovo oggetto. – codeDr