Optimizar tamaño de estructura de Datos

Iniciado por AlbertoBSD, 22 Julio 2016, 19:03 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

Muy buen dia estoy buscando optimizar el tamaño de una estructura dada.

Habia visto que es posible especificar el tamaño de una variable a nivel de bits.

struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x,y;
struct nodo *aristas[4];
};


Quiero optimizar las variables tabla, x é y

Las variables solo tiene valores del 0 al 15, con lo cual 4 bits serian suficientes.

Habia visto que se puede especificar el tamaño de la variable ejemplo:

struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x:4;
unsigned char y:4;
struct nodo *aristas[4];
};


Pero no se hacerlo para la variable tabla.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

ivancea96

Con arrays no se puede.

Sin embargo, si tienes un tabla[4][4], y quieres que sea cada uno de 1 bit, por ejemplo, te sirve poner un uint16_t, y acceder con operadores de bit.

crack81

#2
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t  2 bytes

PD: Cual es el objetivo de optimizar el struct?
Saludos....
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

ivancea96

Cita de: crack81 en 22 Julio 2016, 19:30 PM
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t  2 bytes
Si es [4][4], son 16 bits, 2 bytes

AlbertoBSD

#4
Cita de: crack81 en 22 Julio 2016, 19:30 PM
PD: Cual es el objetivo de optimizar el struct?

El objetivo es ahorrar espacio para guardar la tabla en archivos, el detalle es que en este punto el programa sigue generando Nodos y  actualmente lleva mas de 7.8 Millones de Nodos

Cuenta, 16 bytes por 7.8 Millones en un archivo son 124 MB por lo cual poder quitarle la mitad del peso se me haria fantastico, ya que en este punto desconozco cuantos nodos mas se valla a generar.

ivancea96, creo que voy a tener una estructura adicional asi como lo comentas, y calcular esa estructura con operaciones de bits y Guardar el resultado en una sola variable de 64 bits.

Lo que seria un unsgined long long


Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

crack81

Si lo resuelves el problema estaría genial que publicaras como lo hiciste
Saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

AlbertoBSD

#include<stdio.h>

struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x,y;
struct nodo *aristas[4];
};

int main() {
int i = 0,j;
struct nodo a;
unsigned long long int c = 0;
while(i < 4) {
j = 0;
while(j < 4) {
a.tabla[i][j] = 16;
c = c<<4;
c += a.tabla[i][j];
j++;
}
i++;
}
printf("%llu",c);
}


Pues el ejemplo asi quedo, se termina guardando todo el arreglo en una sola variable de 64bits y simplemente me quedaría usar fwrite para guardar la variable en archivo. Y aplicaría el método inverso para devolverla a una tabla.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

AlbertoBSD

Pues resulta que esa aproximacion que publique, ya implementada es muy lentaaaa  :-\

Tendre que o bien conformarme con la estructura original o en su defecto reprogramar la funcion que crea los nodos para que desde el principio se encuentren "comprimidos" en memoria la informacion deseada.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

ivancea96

Lo que te comentaba, es que en vez de mantener tu tabla de 4x4, pongas directamente el uint64_t y trabajes con él. Luego, basta hacer un par de funciones o defines para acceder a los datos :o

AlbertoBSD

Voy a implementarlo asi como comentas.

Por cierto en este punto ya van 16.8 Millones De Nodos en el Grafo y en  el Arbol  ;-) ;-)  ;-)  y el archivo pesa sobre 320 MB.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW