elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Optimizar tamaño de estructura de Datos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Optimizar tamaño de estructura de Datos  (Leído 5,240 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Optimizar tamaño de estructura de Datos
« en: 22 Julio 2016, 19:03 pm »

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.

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x,y;
  5. struct nodo *aristas[4];
  6. };
  7.  

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:

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x:4;
  5. unsigned char y:4;
  6. struct nodo *aristas[4];
  7. };
  8.  

Pero no se hacerlo para la variable tabla.

Saludos!


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #1 en: 22 Julio 2016, 19:18 pm »

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.


En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Optimizar tamaño de estructura de Datos
« Respuesta #2 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

PD: Cual es el objetivo de optimizar el struct?
Saludos....
« Última modificación: 22 Julio 2016, 19:38 pm por crack81 » En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #3 en: 22 Julio 2016, 19:36 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
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #4 en: 22 Julio 2016, 19:48 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!
« Última modificación: 22 Julio 2016, 19:55 pm por AlbertoBSD » En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Optimizar tamaño de estructura de Datos
« Respuesta #5 en: 22 Julio 2016, 20:46 pm »

Si lo resuelves el problema estaría genial que publicaras como lo hiciste
Saludos...
En línea

Si C/C++ es el padre de los lenguajes entonces ASM es dios.
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #6 en: 22 Julio 2016, 22:03 pm »

Código
  1. #include<stdio.h>
  2.  
  3. struct nodo {
  4. int id;
  5. unsigned char tabla[4][4];
  6. unsigned char x,y;
  7. struct nodo *aristas[4];
  8. };
  9.  
  10. int main() {
  11. int i = 0,j;
  12. struct nodo a;
  13. unsigned long long int c = 0;
  14. while(i < 4) {
  15. j = 0;
  16. while(j < 4) {
  17. a.tabla[i][j] = 16;
  18. c = c<<4;
  19. c += a.tabla[i][j];
  20. j++;
  21. }
  22. i++;
  23. }
  24. printf("%llu",c);
  25. }

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!
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #7 en: 23 Julio 2016, 05:19 am »

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
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #8 en: 23 Julio 2016, 13:49 pm »

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
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Optimizar tamaño de estructura de Datos
« Respuesta #9 en: 23 Julio 2016, 15:25 pm »

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
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines