Criar matrizes muito grandes [RESOLVIDO]

1. Criar matrizes muito grandes [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 28/11/2020 - 14:49h

Boa tarde.
Eu preciso de 3 matrizes com 40 000 linhas e 40 000 colunas cada ([40000][40000]).
Alguém sabe como eu posso fazer isso.
Tentei alocação estática e não funcionou (definir as matrizes antes da função main).
Se alguém souber vi o eu posso fazer isso, serei eternamente grato.


  


2. MELHOR RESPOSTA

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 30/11/2020 - 11:41h

Estou num celular, então posso errar alguma sintaxe.

#define TAM_X 40000
#define TAM_Y 40000
double *p = (double *)malloc(TAM_X * TAM_Y * sizeof(double));

Ou
#define TAM_X 40000
#define TAM_Y 40000
double **p = (double **)malloc(TAM_X * sizeof(double *));
for (int i=0;i< TAM_X;i++)
p[i] = (double *)malloc(TAM_Y * sizeof(double));

Dependendo de como é seu estilo de codificação vc usa um ou outro. Como o colega falou suas matrizes estão muito grandes. O gcc adicionou um monte de verificação em tempo de compilação e memm max pode ser uma delas, ou seja, vc pode não conseguir compilar seu código ou então desabilitar algumas flags.

3. Alocação Dinâmica de Memória

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Debian)

Enviado em 28/11/2020 - 17:17h

De uma olhada no conteudo deste site: https://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html
Veja a parte sobre matrizes, creio que isto pode te ajudar


4. Como fazer isso em C++

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 30/11/2020 - 10:41h

Valeu pela dica :)
Só que depois eu vi que meu codigo esta em C++ e eu tentei usar esse método de alocacao dinamica e nao funcionou. Fiz o seguinte:

int main(){
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);
double (*q_matriz)[40000][40000]=malloc(sizeof *q_matriz);
double (*r_matriz)[40000][40000]=malloc(sizeof *r_matriz);
double (*s_matriz)[1000][1000]=malloc(sizeof *r_matriz);
#define m (*p_matriz)
#define t1 (*q_matriz)
#define t2 (*r_matriz)
#define ma (*s_matriz)

// . . .
free(p_matriz);
free(q_matriz);
free(r_matriz);
free(s_matriz);


Aparece a seguinte mensagem de erro:
invalid conversion from ‘void*’ to ‘double (*)[40000][40000]’ [-fpermissive]
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);

OBS: ESTOU ESCREVENDO EM C++.


5. Re: Criar matrizes muito grandes

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 30/11/2020 - 10:56h

Uma coisa que você não notou, é que: 40000 x 40000 dá exatos 6,4x10^13, ou melhor, são 64'000'000'000'000 elementos numa única matriz.
O que isso significa?
Que se você usar um double comum de 8 bytes cada, você vai precisar de 6,4x10^2 vezes 8 bytes para alocar tudo isso.
Ou melhor, a não ser que você tenha um computador da nasa (não estou brincando) você não conseguirá usar nem alocar tal matriz.
6,4x10^2 vezes 8 bytes são 512'000'000'000'000 bytes
Ou seja, 512TB de memória necessários pra armazenar tal matriz.

____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://cpusam.github.io/


6. Re: Criar matrizes muito grandes [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 30/11/2020 - 11:39h

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++


7. Re: Criar matrizes muito grandes

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Debian)

Enviado em 30/11/2020 - 12:24h

linersantos escreveu:

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++


Em c para se alocar a memoria de um vetor, por exemplo, normalmente seria assim:
#define LENGTH 5
int *vet = (int *) malloc(LENGTH * sizeof(int));

Em c++ isso seria o equivalente a fazer:
int *vet = new int[LENGTH];


8. Re: Criar matrizes muito grandes [RESOLVIDO]

Gustavo Samuel Bacagine Azevedo
Bacagine

(usa Debian)

Enviado em 30/11/2020 - 12:34h

linersantos escreveu:

Valeu pela dica :)
Só que depois eu vi que meu codigo esta em C++ e eu tentei usar esse método de alocacao dinamica e nao funcionou. Fiz o seguinte:

int main(){
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);
double (*q_matriz)[40000][40000]=malloc(sizeof *q_matriz);
double (*r_matriz)[40000][40000]=malloc(sizeof *r_matriz);
double (*s_matriz)[1000][1000]=malloc(sizeof *r_matriz);
#define m (*p_matriz)
#define t1 (*q_matriz)
#define t2 (*r_matriz)
#define ma (*s_matriz)

// . . .
free(p_matriz);
free(q_matriz);
free(r_matriz);
free(s_matriz);


Aparece a seguinte mensagem de erro:
invalid conversion from ‘void*’ to ‘double (*)[40000][40000]’ [-fpermissive]
double (*p_matriz)[40000][40000]=malloc(sizeof *p_matriz);

OBS: ESTOU ESCREVENDO EM C++.


Você está fazendo a alocação da matriz de maneira errada
Vou enviar um video muito bom do professor Backes onde ele mostra exatamente como fazer isso:
https://www.youtube.com/watch?v=W4vbwEJn11U

O que você precisa aprender começa a partir de 1:51


9. Re: Criar matrizes muito grandes [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 30/11/2020 - 13:29h

Bacagine escreveu:

linersantos escreveu:

entao, eu fiz um rascunho em C usando alocacao dinamica e deu certo. Eu so preciso saber como fazer a alocacao dinamica em C++


Em c para se alocar a memoria de um vetor, por exemplo, normalmente seria assim:
#define LENGTH 5
int *vet = (int *) malloc(LENGTH * sizeof(int));

Em c++ isso seria o equivalente a fazer:
int *vet = new vet[LENGTH];

Em c++ a sintaxe é mais próxima de java. Então é assim q deve ser feito.
Outra coisa q lembrei é que o próprio sistema coloca limite nos recursos usados pelos usuários., senão um úbico usuário pode travar o sistema

https://www.dicas-l.com.br/arquivo/como_impedir_a_bomba_fork___atraves_da_limitacao_dos_recursos_de_...


10. Re: Criar matrizes muito grandes [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 01/12/2020 - 11:28h

Obrigado a todos pelas valiosas dicas e eis como eu escrevi para o caso de alguem precisar futuramente.

//...
int main(){
#define tamx 50000
#define tamy 50000
#define trento 210
double **m = (double **)malloc(tamx * sizeof(double *));
double **t1 = (double **)malloc(tamx * sizeof(double *));
double **t2 = (double **)malloc(tamx * sizeof(double *));
double **ma = (double **)malloc(trento * sizeof(double *));
for(int i = 0; i<tamx; i++){
m[i] = (double *)malloc(tamy * sizeof(double));
t1[i] = (double *)malloc(tamy * sizeof(double));
t2[i] = (double *)malloc(tamy * sizeof(double));
}
for(int i = 0; i< trento; i++){
ma[i] = (double *)malloc(trento * sizeof(double));
}
//...
free(ma);
free(m);
free(t1);
free(t2);







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts