Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[C] Array de 4 dimensiones

Estas en el tema de [C] Array de 4 dimensiones en el foro de C/C++ en Foros del Web. Buenas, quiero hacer un array de 4 dimensiones en C, pero una vez inicializado el programa consume 1.4GB de RAM, y no conviene... Dado que ...
  #1 (permalink)  
Antiguo 21/01/2010, 08:44
Avatar de delarub  
Fecha de Ingreso: mayo-2009
Mensajes: 20
Antigüedad: 15 años
Puntos: 2
[C] Array de 4 dimensiones

Buenas, quiero hacer un array de 4 dimensiones en C, pero una vez inicializado el programa consume 1.4GB de RAM, y no conviene...
Dado que en realidad son caracteres lo que represento, en php lo haria así $stats["$a$b"]["$c$d"];

Necesito tener en el primer indice un string de 2 letras de largo y en el segundo igual. Pero como en C no se puede poner indices como strings, he pensado en hacerlo así:
stats[a][b][c][d]; y claro, el problema está en que tengo que alojar en la memoria para evitar fallos de segmentación.

El codigo de inicialización es el siguiente:
Código C:
Ver original
  1. stats = (int ****)malloc(256 * sizeof(int ***));
  2.     int a, b, c, d;
  3.     for(a = 0; a <256; a++) {
  4.         stats[a] = (int ***)malloc(256 * sizeof(int **));
  5.         for(b = 0; b < 256; b++) {
  6.             stats[a][b] = (int **)malloc(dif * sizeof(int *));
  7.             for (c = 0; c < dif; c++) {
  8.                 stats[a][b][c] = (int *)malloc(dif * sizeof(int));
  9.                 for (d = 0; d < dif; d++) {
  10.                     stats[a][b][c][d] = 0;
  11.                 }
  12.             }
  13.         }
  14.     }

dif en este caso es 74, pero es variable.

256 x 256 x 74 x 74 x 4 (tamaño de un int) = 1.4Gb...

Alguna solución?

Última edición por delarub; 21/01/2010 a las 09:11
  #2 (permalink)  
Antiguo 21/01/2010, 08:56
 
Fecha de Ingreso: enero-2010
Mensajes: 24
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: [C] Array de 4 dimensiones

Buenas

Que tipo de datos (y rango 0-1, 0-16, 0-256, 0-65536, ...), vas a almacenar en la variable final stats[a][b][c][d] = ¿?

Saludos
  #3 (permalink)  
Antiguo 21/01/2010, 09:04
Avatar de delarub  
Fecha de Ingreso: mayo-2009
Mensajes: 20
Antigüedad: 15 años
Puntos: 2
Respuesta: [C] Array de 4 dimensiones

Cita:
Iniciado por Megamouse Ver Mensaje
Buenas

Que tipo de datos (y rango 0-1, 0-16, 0-256, 0-65536, ...), vas a almacenar en la variable final stats[a][b][c][d] = ¿?

Saludos
Es un contador que se incrementa en un loop.
Es decir yo genero un string aleatoriamente (no realmente aleatoriamente pero para explicarlo ya va bien) de 2 letras de largo, que son a y b. Por cada uno de esos strings se generan otros (aa, ab, ac... ba, bb, bc... etc) que son c y d.
Entonces quedaria algo así:
c = 0, d = 0, se genera a y b a partir de estos, y incrementaria el contador: stats[a][b][c][d]++;
Luego d sube 1, y lo mismo (a y b cambian). Así hasta que d llega a dif (que en el primer post de ejemplo puse 74) y c sube uno, y se va repitiendo.

Espero haberme explicado, es un poco raro
  #4 (permalink)  
Antiguo 21/01/2010, 09:25
 
Fecha de Ingreso: enero-2010
Mensajes: 24
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: [C] Array de 4 dimensiones

Cita:
Iniciado por delarub Ver Mensaje
Es un contador que se incrementa en un loop.
Es decir yo genero un string aleatoriamente (no realmente aleatoriamente pero para explicarlo ya va bien) de 2 letras de largo, que son a y b. Por cada uno de esos strings se generan otros (aa, ab, ac... ba, bb, bc... etc) que son c y d.
Entonces quedaria algo así:
c = 0, d = 0, se genera a y b a partir de estos, y incrementaria el contador: stats[a][b][c][d]++;
Luego d sube 1, y lo mismo (a y b cambian). Así hasta que d llega a dif (que en el primer post de ejemplo puse 74) y c sube uno, y se va repitiendo.

Espero haberme explicado, es un poco raro
pues a decir verdad, no tengo ni idea de que es lo que quieres hacer.

¿Contar en numero de estados distintos?
¿Contar el numero total de estados (repetidos incluidos)?
¿Almacenar el valor de todos los estados?

¿Puedes poder un cutre-ejemplo (con valores) para ver que es lo que quieres?
  #5 (permalink)  
Antiguo 21/01/2010, 09:43
Avatar de delarub  
Fecha de Ingreso: mayo-2009
Mensajes: 20
Antigüedad: 15 años
Puntos: 2
Respuesta: [C] Array de 4 dimensiones

Cita:
Iniciado por Megamouse Ver Mensaje
pues a decir verdad, no tengo ni idea de que es lo que quieres hacer.

¿Contar en numero de estados distintos?
¿Contar el numero total de estados (repetidos incluidos)?
¿Almacenar el valor de todos los estados?

¿Puedes poder un cutre-ejemplo (con valores) para ver que es lo que quieres?
Es para un proyecto sobre estadística y probabilidad de los sistemas de criptografía actuales.
Para generar las estadísticas de los distintos tipos de funciones hash, hago un loop para generar todas las permutaciones posibles de 5 letras de largo con las letras que yo le proporciono al programa (que en este caso, son 74 diferentes).
Por cada permutacion genero un hash y me quedo con los dos primeros chars de éste (que pueden ir desde 0 hasta 255) (a y b), y de la permutacion actual cojo las dos primeras letras (c y d).
Entonces incremento el contador con estas variables para saber que, pongamos, en un hash que empieza por af hay 28 palabras que empiezan por jc, por decir algo.

Se entiende mejor?
  #6 (permalink)  
Antiguo 22/01/2010, 02:24
 
Fecha de Ingreso: enero-2010
Mensajes: 24
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: [C] Array de 4 dimensiones

Cita:
Iniciado por delarub Ver Mensaje
Es para un proyecto sobre estadística y probabilidad de los sistemas de criptografía actuales.
Para generar las estadísticas de los distintos tipos de funciones hash, hago un loop para generar todas las permutaciones posibles de 5 letras de largo con las letras que yo le proporciono al programa (que en este caso, son 74 diferentes).
Por cada permutacion genero un hash y me quedo con los dos primeros chars de éste (que pueden ir desde 0 hasta 255) (a y b), y de la permutacion actual cojo las dos primeras letras (c y d).
Entonces incremento el contador con estas variables para saber que, pongamos, en un hash que empieza por af hay 28 palabras que empiezan por jc, por decir algo.

Se entiende mejor?
Algo mas se entiende, como los valores que vas a usar son 0-255 te cabe en un solo bit, por lo que puedes almacenarlo en un char (eso ya seria 4 veces menos memoria).

Lo otro seria si quieres calcular todas las combinaciones de a+b (en tu caso 74*74), no reservar la memoria para todas las convinaciones distintas de c+d (256*256) si no unicamente para las que surjan (dale al realloc).

Si para "af" hay (por ejemplo) 10000 c+d combinaciones distintas no tiene sentido reservar la memoria para el maximo 65536.

La parte de estadistica no es mi fuerte, pero si puedes saber (a ojo) cuantas convinaciones son realmente posibles (y diferentes) probablemente puedas reducir el consumo de memoria.

O otra manera seria no cargar todo en memoria, para cada distinto a+b puedes reservar memoria solo para su c+d correspondiente, y una vez calculados todos sus valores grabar la informacion interesante (en un fichero o BBDD) y liberar la memoria de c+d, pasar al siguiente a+b y repetir el proceso.

Etiquetas: dimensiones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:51.