Gerar matrizes grandes [RESOLVIDO]

1. Gerar matrizes grandes [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 02/06/2020 - 12:16h

Bom dia.
Estou com um problema. Preciso gerar uma matriz 10 000 x 10 000 mas qdo eu executo o codigo aparece a mensagem
Segmentation fault (core dumped)
O código está certinho, pois ate matrizes do tipo 1000 x 1000 ele gera de boa.
Alguem pode me ajudar?
Grato.

#include <stdio.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_statistics.h>

int main(){
int i,j;
double M[1000][1000];
FILE *f = fopen("resultado.dat","wf");
for(i = 0;i<1000; i++){
for (j=0;j<1000; j++){
M[i][j] = i+j;
fprintf(f,"%lg",M[i][j]);
}
fprintf(f,"\n");
}
fclose(f);
}


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/06/2020 - 16:27h

Cada double ocupa, em geral, 8 bytes. Numa matriz com 10.000 por 10.000, você tem cem milhões de elementos. Com 8 bytes em cada um deles, serão 800MB de espaço.

Provavelmente seu computador, se tiver menos de quinze anos, tem mais memória que isso.

Só que também faz diferença a forma como você pede que alocação seja feita. Da forma como você fez, você pediu para que a matriz fosse alocada de forma automática, o que, nos nossos PCs, implica alocação na pilha do processador, que normalmente tem muito mais restrições do que a memória de uso geral.

Experimente mudar a forma de alocação. Tente usar alocação estática ou alocação dinâmica.

// Como você tentou fazer, usando alocação automática.
int main(void){
double matriz[10000][10000];
/* ... */
}


// Alternativa 1: alocação estática explícita com escopo restrito ao bloco de main().
int main(void){
static double matriz[10000][10000];
/* ... */
}

// Alternativa 2: alocação estática por meio do uso de escopo global.
double matriz[10000][10000];

int main(void){
/* ... */
}

// Alternativa 3: alocação dinâmica.
int main(void){
double (*p_matriz)[10000][10000]=malloc(sizeof *p_matriz);
if(p_matriz==NULL){
fprintf(stderr, "Alocação de memória para matriz falhou.\n");
exit(1);
}
#define matriz (*p_matriz)
/* ... */
// Ao final do uso, convém liberar a memória.
free(p_matriz);
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Gerar matrizes grandes [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/06/2020 - 16:40h

Uma observação: como você está usando uma biblioteca de computação científica (GSL), se suas matrizes ficarem realmente grandes, pode ser interessante usar a representação de matrizes esparsas (nas quais os elementos iguais a zero não são armazenados) oferecida pela biblioteca.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


4. Re: Gerar matrizes grandes [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 02/06/2020 - 21:53h

Valeu camarada!
Quando usei alocacao deu certo :)
De fato, GSL tem mtas funções úteis e estou aprendendo a trabalhar com ele.