Sei que este não é um lugar adequado para esta pergunta mais…
Eu preciso fazer um programa em C++ que leia um .ber de 1,5gb. Quando ao decode do .ber, usando um projeto opensource http://lionet.info/asn1c fica muito facil fazer.
O problema esta em ler o arquivo, criando um buffer de + de um mega, o programa ja trava na hora.
Então minha pergunta é: Existe algum parametro para ser passado no makefile que aumenta a memoria que pode ser alocada pelo programa
C++
10 Respostas
Bem, vc disse que é fácil fazer usando o tal projeto. Então, como é feita normalmente a leitura de um arquivo desses? (eu estou acessando a net por um maldito proxy, então não posso nem ver do que se trata).
Sobre a memória, o limite é o sistema operacional, que acredite, é bem grande, apesar que nunca aloquei 1.5 GB de uma vez hehehe
flw
Então amigo, não estou tentando alocar 1,5g de uma vez, apenas 1 mega de cara vez de entrada e 1 mega de saida (ja que os dados decodificados serão gravados em uma arquivo texto para futuramente fazer um shell script que acessa um sql loader e joga em uma base oracle) as linhas abaixo ja travam o meu programa C++
#define MAX_BUFFER_SIZE 1000000
.
.
.
char buffer[MAX_BUFFER_SIZE];
char bufferSaida[MAX_BUFFER_SIZE];
O projeto não le arquivos, apenas o buffer que eu passar. Que eu gostaria que fosse de no minimo 1 mega.
Em vez de criar uma variável global (que tem limite de tamanho bastante pequeno, por sinal), aloque-a usando new (C++) ou malloc (C/C++).
Se você estiver usando o Windows, você não pode alocar mais de 1.3 Gb (ou 1.5GB, não sei exatamente o limite) em um programa em um único bloco. Mas 1MB dá para alocar sem problemas.
Thingol, obrigado pela resposta, usando o new ou o malloc funionou perfeitamente. Tb achei estranho 1mb travar o programa.
tente esses flags.
-fmem-report --param=ggc-min-heapsize=1024 --param=ggc-min-expand=1 -Ox -Q
Olá
Posso estar completamente enganado pois faz tempo que não escrevo código C/C++, mas manipular arquivos gigantes não era para fazer usando arquivos de memória mapeada?
[]s
Luca
Luca, eu tb não sei. Vou pesquisar sobre o assunto. De qualquer forma usando um buffer alocado dinamicamente ja resolveu o meu problema. Obrigado pela resposta. Legal seu avatar 
heheheheheh
O Luca é o pai do Indiana jones 
Tente alocar o buffer assim:
#define MAX_BUFFER_SIZE 1048576
char *buffer, *bufferSaida;
// Alocando os buffers
buffer = malloc(MAX_BUFFER_SIZE);
bufferSaida = malloc(MAX_BUFFER_SIZE);
// Enchendo os buffers de 0s..
memset(buffer, MAX_BUFFER_SIZE, 0);
memset(bufferSaida, MAX_BUFFER_SIZE, 0);
// Para desalocar os buffers
free(buffer);
free(bufferSaida);
Aqui funcionou…
Ah agora entendi, você tentou alocar estaticamente os buffers… é aí realmente há um limite bem mais baixo pra isso.
Talvez a solução do fmeyer possa resolver isso, pois parece estar aumentando o espaço da pilha, mas não sei porque nunca usei isso.
Bom, não sei o que é arquivo de memória mapeada, mas tenho alguma experiência com arquivos grandes… até uns 700 MB, mais precisamente avi’s. Tinha também buffers para leitura de som e vídeo, e funcionava tudo corretamente.
flw