Compilador não quer compilar Struct com 3000 registros! [RESOLVIDO]

1. Compilador não quer compilar Struct com 3000 registros! [RESOLVIDO]

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 04/12/2021 - 22:13h

Boa Noite a Todos!

O g++ está apresentando o erro abaixo quando compilo minha Struct com 3000 Registros! E aceita se eu diminuir para 1000. O Problema é que a idéia é que essa Struct venha a ter 10 Milhões de registros, e isso me preocupou extremamente!
g++ test.cpp -o test -O3 -Wall -pedantic -pedantic-errors -Werror
/tmp/cc7ATGWW.o: in function `Load_Database(int)':
test.cpp:(.text+0x7b7): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0x9cd): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xa25): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xa68): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xaa1): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xae8): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xb2a): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xb5c): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xbb8): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xc35): relocation truncated to fit: R_X86_64_32S against `.bss'
test.cpp:(.text+0xc83): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status


Struct com o problema: Só compila se eu trocar 3000 por 1000, mas preciso colocar 1 Milhão, 3000 era só o começo...
struct {
char A [ 20],
AAA [ 20],

AAAA [ 201],
AAAAA [ 201],
AAAAAA [ 201],
AAAAAAA [500001],

B [ 201],
BB [ 201],
BBB [ 201],
BBBB [500001],

BBBBB [ 401],
BBBBBB [ 401],
BBBBBBB [ 601];

} Dados1[3000], Dados2[3000];



  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 04/12/2021 - 23:07h

Não será possível alocar tanta memória pra essa sua struct.
Só verificar com o sizeof de um único elemento:
#include<iostream>

struct SData {
char A [ 20],
AAA [ 20],

AAAA [ 201],
AAAAA [ 201],
AAAAAA [ 201],
AAAAAAA [500001],

B [ 201],
BB [ 201],
BBB [ 201],
BBBB [500001],

BBBBB [ 401],
BBBBBB [ 401],
BBBBBBB [ 601];

};

int main(void) {
std::cout<<"Data.size = "<<sizeof(SData)<<std::endl;
return 0;
}

O tamanho indicado por sizeof no meu sistema de 64 bits é: Data.size = 1002651
ou seja, são 1'002'651 bytes pra apenas um único struct.
Sendo assim e se você quiser alocar 1 milhão deles?
Basta multiplicar 1'002'651*1'000'000 = 1'002'651'000'000 bytes! Ou aproximadamente 1 tera byte.
Não existe uma RAM pra pc comum que caiba tanttos struct desse tamanho, então, você terá que necessariamente, guardar o vetor no HD e ler/escrever de lá mesmo.
Mas convenhamos, seria mais simples armazenar num banco de dados tipo MySQL e afins, isso se fosse numa aplicação usada para fins comerciais.
Mas se é penas pra aprendizado, tá de boa reinventar a roda.

3. Re: Compilador não quer compilar Struct com 3000 registros! [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/12/2021 - 01:53h

Teria como mostrar o programa todo? Estou curioso de ver como você usou esses objetos.

Eu estava inclinado a concordar com a explicação dada pelo SamL, mas eu resolvi colocar a mensagem de erro na busca do Google, e receio que a explicação seja um pouco (ou nem tão pouco) mais complicada.

Em todo caso, apesar de parecer que o seu programa é só um teste, já consegui aprender um bocado de coisa que eu não conhecia só por causa da sua dúvida. Só que, como já está tarde e eu tenho compromisso amanhã cedo (na verdade, daqui a pouco, pela manhã), não vou poder me estender agora.


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


4. Re: Compilador não quer compilar Struct com 3000 registros!

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 06/12/2021 - 01:40h

paulo1205 escreveu:
Teria como mostrar o programa todo? Estou curioso de ver como você usou esses objetos.

Não é um programa, eu estava fazendo testes com Struct e sizeof, então criei um uma Struct vazia! Simulei campos, o maior campo seria tipo do tamanho de um arquivo txt. Inicialmente estava indo bem, mas imaginei um programa onde tivessem uns 5 Campos do tamanho de um txt, mas bugou com 2 campos apenas. Inicialmente rodei em C, mas qdo passei pra C++ bugou com 1300 registros.

O Algoritmo escreve a letra A 10000 vezes com um for enviando para os 2 campos grandes, os outros ficavam vazios mesmo, como deu certo inicialmente apenas fui rodar em C++ mas bugou. De 2100 registros, preenchi apenas 1300, qdo passei o Database manualmente para 10.000 registros o erro deu ao compilar. Então diminui de 10000 até 2100 que era o máximo que o compilador estava aceitando, Hoje, ele chegou a compilar com 50000 registros mas tá inconsistente. Isso com a Struct completamente vazia, Abaixo a base que estou usando, mas lembrando que não é um programa, apenas testes. Ele dá Segmentation fault sem rodar a função!

//gcc test.c -o test -O3 -Wall -pedantic -pedantic-errors -Werror
//g++ test.cpp -o test -O3 -Wall -pedantic -pedantic-errors -Werror
struct {
char A [ 20],
AAA [ 20],

AAAA [ 201],
AAAAA [ 201],
AAAAAA [ 201],
AAAAAAA [500001],

B [ 201],
BB [ 201],
BBB [ 201],
BBBB [500001],

BBBBB [ 401],
BBBBBB [ 401],
BBBBBBB [ 601];

} Dados1[50000], Dados2[50000]; // C OK, 60.000 Buga!
//} Dados1[90000], Dados2[90000]; // C Segmentation fault

// PENDENT Bugando acima de 2100 Registros em C++!
// BUGA com 100000 Registros em C, dá Segmentation fault, aceitou 90.000 e deve aceitar mais!
// Agora tá bugando com 60.000 em C

#include <stdio.h>
#include <string.h>

void Load_Database(int Update) {
int x = 0;
for( ; x < Update; x++)
for(int y = 0; y < 10000; y++) {
strcat(Dados1[x].AAAAAAA, "A");
strcat(Dados1[x].BBBB, "A");
}

printf("%ld, %ld\n", sizeof Dados1, sizeof Dados2);
printf("%s\n", Dados1[0].AAAAAAA);
}

int main() {
//Load_Database(10000);
printf("%ld, %ld\n", sizeof Dados1, sizeof Dados2);
}








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts