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

Uso de matrices con gran cantidad de datos

Estas en el tema de Uso de matrices con gran cantidad de datos en el foro de C/C++ en Foros del Web. Hola, tengo que analizar una matriz con 80 millones de celdas y que tengo almacenada en un archivo txt. Uso el sieguiente código: Código: int ...
  #1 (permalink)  
Antiguo 18/03/2011, 16:40
Avatar de Nietzsche  
Fecha de Ingreso: enero-2005
Ubicación: MALAGA-ESPAÑA
Mensajes: 228
Antigüedad: 19 años, 3 meses
Puntos: 0
Uso de matrices con gran cantidad de datos

Hola, tengo que analizar una matriz con 80 millones de celdas y que tengo almacenada en un archivo txt.

Uso el sieguiente código:

Código:
int adjacency[dimension][dimension];

// Loading Adjacency Matrix
f = fopen("adjacency.txt", "r");
for(i = 0; i < dimension; i++){
    for(j = 0; j < dimension; j++){
        fscanf(f, "%d", &adjacency[i][j]);
		}
	}
fclose(f);
La matriz se almacena correctamente si el valor "dimension" es menor a 1400. En caso de que le de un valor mayor recibo un "Segmentation Fault" y como ya digo mi matriz es de 9.200 x 9.200-

¿A que se bede esto?
__________________
Salud y libertad
  #2 (permalink)  
Antiguo 18/03/2011, 19:02
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Uso de matrices con gran cantidad de datos

Supongo que es porque esa matriz ocupa mas de 300MB en memoria del stack. y los programas no tiene permitido almacenar tanto en lel stack....proba almacenandola en memoria dinamica con malloc o new segun sea c o c++ respectivamente.
  #3 (permalink)  
Antiguo 19/03/2011, 09:53
Avatar de Nietzsche  
Fecha de Ingreso: enero-2005
Ubicación: MALAGA-ESPAÑA
Mensajes: 228
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Uso de matrices con gran cantidad de datos

Efectivamente creo que ese es el problema.

¿Como se generaria la memoria dinamica para una matriz nxn de enteros con el metodo malloc??
__________________
Salud y libertad
  #4 (permalink)  
Antiguo 19/03/2011, 14:42
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Uso de matrices con gran cantidad de datos

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. int main (void){
  7.  
  8.     int **matriz;
  9.     int nfil, ncol, i, j;
  10.  
  11.     //Pedimos los valores para saber de cuanto será la matriz (nfil)x(ncol)
  12.     printf ("Filas: "); scanf("%d", &nfil);
  13.     fflush(stdin);
  14.     printf ("Columnas: "); scanf("%d", &ncol);
  15.     fflush (stdin);
  16.  
  17.  
  18.     //Reservamos memoria para la matriz
  19.     matriz=malloc(sizeof(int*)*nfil);
  20.  
  21.     for (i=0; i<nfil; i++)
  22.         matriz[i]=malloc(sizeof(int)*ncol);
  23.  
  24.  
  25.  
  26.     //Pedimos valores para los elementos de la matriz
  27.  
  28.     for (i=0;i<nfil;i++){
  29.         for (j=0;j<ncol;j++){
  30.             printf ("Elemento (%d,%d): ", i,j);
  31.             scanf ("%d", &(matriz[i][j]));
  32.             fflush (stdin);
  33.         }
  34.     }
  35.  
  36.  
  37.     //Imprimimos los valores en pantalla
  38.  
  39.     for (i=0;i<nfil;i++){
  40.         for (j=0;j<ncol;j++){
  41.             printf ("Elemento (%d,%d)=(%d) ", i,j, matriz[i][j]);
  42.  
  43.         }
  44.     }
  45.  
  46.     //liberamos la memoria que creamos con malloc
  47.     for (i=0;i<nfil;i++){
  48.         free(matriz[i]);
  49.     }
  50.     free (matriz);
  51.  
  52.     getch();
  53.     return (0);
  54. }

Es algo parecido a esto que he sacado de los apuntes de clase, el problema es que no compila cuando hacemos malloc por que el dice que el tipo definido INT no puede convertirlo a VOID ...y no se realiza correctamente. Su puta madre. El funcionamiento es así, y en vez de pdir que el usuario introduzca los valores para la matriz pues se los defines como constantes. A ver si alguien te puede echar una mano para terminar de solucionarlo.


Te pongo un enlace al archivo con los apuntes sobre el tema para manejar vectores y matrices estaticos y dinamicos.
http://www.megaupload.com/?d=BA31DLX2

Última edición por fingeroso; 19/03/2011 a las 15:01
  #5 (permalink)  
Antiguo 19/03/2011, 17:27
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Uso de matrices con gran cantidad de datos

hace un casteo de los datos asi:

Código C:
Ver original
  1. matriz= (int **) malloc(sizeof(int*)*nfil);
  2.  
  3.     for (i=0; i<nfil; i++)
  4.         matriz[i]=  (int *) malloc(sizeof(int)*ncol);

Etiquetas: cantidad, matrices
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 15:45.