Nella mia applicazione, devo caricare volumedata dal set di immagini (immagini MRC) e mantenere i dati dei pixel in memoria (le immagini sono grigie, quindi un byte per pixel).Struttura dati per memorizzare enormi quantità di dati?
Il mio ambiente di sviluppo è QT framework, MinGW per Windows e GCC per Linux.
Al momento, io uso una semplice struttura di dati per memorizzare volumedata come:
unsigned char *volumeData;
ed eseguire un'allocazione enorme come segue.
volumeData=new unsigned char[imageXsize * imageYsize * numofImages];
seguito sono i metodi importanti per accedere immagini-dati in uno stesso piano, come
unsigned char* getXYPlaneSlice(int z_value);
unsigned char* getYZPlaneSlice(int x_value);
unsigned char* getZXPlaneSlice(int y_value);
Con la mia semplice struttura di dati era facile implementare metodi precedenti.
Ma potremmo aver bisogno di adottare le dimensioni del volume come 2000x2000x1000 (~ 3,7 Gb) in futuro. E l'attuale infrastruttura non sarà in grado di gestire tali enormi dati.
Come evitare la frammentazione? Ora, anche con dati 1000x1000x200, l'arresto anomalo dell'applicazione ha generato bad_alloc. Qual è il modo migliore per cambiare il datastructure per questo? devo usare qualcosa come lista collegata che ogni pezzo è di dimensione 100mb.
Inoltre, l'utente dovrebbe essere in grado di perfezionare alcuni filtri di elaborazione delle immagini sui dati del volume e dovrebbe anche essere in grado di ripristinare il valore originale del pixel. Ciò significa che dovrei conservare due copie di dati volume. Con l'attuale implementazione è come.
char senza segno * volumeDataOriginale;
char senza segno * volumeDataCurrent;
Quindi con 2000x2000x1000 intervallo di dati utilizzerà almeno 8 GB (4 GB per volume). Ma in Win32, lo spazio degli indirizzi è 4GB. Come affrontare questo? Dovrei andare con l'applicazione a 64 bit?
EDIT: Ecco un'istantanea della mia domanda
Fondamentalmente, caricare il volume-dati (dal set di immagini, da MRC format..etc) e visualizzarli in diversi piani-visualizzatori (XY , YX, YZ.Image mostra il visualizzatore del piano XY). Devo mantenere più di 3 metodi di accesso ai dati per mostrare un'immagine in un particolare piano. L'utente della barra di scorrimento può modificare l'immagine da mostrare nel piano selezionato)
Grazie in anticipo.
È possibile esplorare il modello di progettazione del Flyweight e attaccare il problema a un livello di progettazione superiore. L'intento è "Usare la condivisione per supportare un gran numero di oggetti a grana fine in modo efficiente". – Chubsdad
Cosa stai facendo con questo enorme pezzo di memoria? Come interagisce l'utente? È difficile stabilire dalla descrizione corrente se la qualità dell'immagine può essere ridotta, se l'intero contenuto deve risiedere nella memoria in ogni momento ecc. – yonilevy
Si può anche prendere in considerazione l'estensione di indirizzamento dell'indirizzo: http://msdn.microsoft.com/en -us/library/aa366527 (VS.85) .aspx – ruslik