En mi aplicación, tengo que cargar datos volumétricos del conjunto de imágenes (imágenes MRC) y mantener los datos de píxeles en la memoria (las imágenes se escalan en grises, por lo tanto, un byte por píxel).¿Estructura de datos para almacenar una gran cantidad de datos?
Mi entorno de desarrollo es QT framework, MinGW para Windows y GCC para Linux.
Por el momento, utilizo una estructura de datos sencilla para almacenar volumedata como:
unsigned char *volumeData;
y realice una enorme asignación de la siguiente manera.
volumeData=new unsigned char[imageXsize * imageYsize * numofImages];
Los siguientes son los métodos importantes para acceder a los datos de imagen-en un plano dado, como
unsigned char* getXYPlaneSlice(int z_value);
unsigned char* getYZPlaneSlice(int x_value);
unsigned char* getZXPlaneSlice(int y_value);
Con mi simple estructura de datos que era fácil de implementar métodos anteriores.
Pero es posible que tengamos que adoptar un tamaño de volumen como 2000x2000x1000 (~ 3.7Gb) en el futuro. Y la estructura de datos actual no podrá manejar esos enormes datos.
Cómo evitar la fragmentación? Ahora, incluso con datos de 1000x1000x200, la falla de la aplicación da como resultado bad_alloc. ¿Cuál es la mejor manera de cambiar la estructura de datos para esto? ¿Debería usar algo así como lista enlazada que cada pedazo es de tamaño 100mb?
Además, el usuario debe ser capaz de perfumar algunos filtros de procesamiento de imágenes en los datos de volumen y también debe ser capaz de restablecer el valor de píxel original. Eso significa que debería conservar dos copias de datos de volumen. Con la implementación actual es similar.
unsigned char * volumeDataOriginal;
unsigned char * volumeDataCurrent;
Con un rango de datos de 2000x2000x1000 va a utilizar aproximadamente 8 Gb (4 Gb por cada volumen). Pero en Win32, el espacio de direcciones es de 4 GB. ¿Cómo abordar esto? Debo ir con la aplicación de 64 bits?
EDIT: Aquí es una instantánea de mi solicitud
Básicamente, me carga los datos de volumen-(de conjunto de imágenes, de MRC format..etc) y mostrarlos en diferentes planas-espectadores (XY , YX, YZ.La imagen muestra XY-plane-viewer). Necesito mantener por encima de 3 métodos de acceso a datos para mostrar una imagen en un plano particular.utilizando el usuario de la barra deslizante puede cambiar qué imagen mostrar en el plano seleccionado)
Gracias de antemano.
Es posible que desee explorar el patrón de diseño Flyweight y atacar el problema en un nivel de diseño superior. La intención es "Uso compartido para admitir un gran número de objetos de grano fino de manera eficiente". – Chubsdad
¿Qué estás haciendo con este enorme trozo de memoria? ¿Cómo interactúa el usuario? Es difícil decir a partir de su descripción actual si la calidad de la imagen puede degradarse, si todo su contenido debe residir en la memoria en todo momento, etc. – yonilevy
También podría considerar la Extensión de ventana de dirección: http://msdn.microsoft.com/en -us/library/aa366527 (VS.85) .aspx – ruslik