C++

10 respostas
Abdon

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

10 Respostas

dudaskank

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

Abdon

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.

T

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.

Abdon

Thingol, obrigado pela resposta, usando o new ou o malloc funionou perfeitamente. Tb achei estranho 1mb travar o programa.

fmeyer

tente esses flags.

-fmem-report --param=ggc-min-heapsize=1024 --param=ggc-min-expand=1 -Ox -Q
Luca

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

Abdon

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 :slight_smile:

fmeyer

heheheheheh

O Luca é o pai do Indiana jones :smiley:

rigolin

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…

dudaskank

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

Criado 27 de julho de 2006
Ultima resposta 31 de jul. de 2006
Respostas 10
Participantes 6