Ir para o conteúdo
kaub0st3r

Melhor usar realloc ou resize

Mensagens Recomendadas

kaub0st3r

Estou com imensos problemas no uso de memoria no C++, mas não sei se não será das definições dos meus vectores dinâmicos.

Acham melhor usar um realloc ou um resize?

cumps


blogue: migalhasfrog.blogspot.comtwitter: ricardo_pt

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não estás a baralhar realloc, tratamento de memória no modelo de c, com a função de redimensionar um objecto vector em c++ ??


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Eu não sei C++ ... mas ... não mistures malloc(), calloc(), realloc(), e free() com as maneiras de gerir a memória em C++!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kaub0st3r

Pois o problema é que necessito mesmo de usar arrays dinâmicos, i.e. eu não queria usar o new[] porque o meu array está constantemente a variar e tanto posso ter um array de 1000 como ter um array de 100 milhões. Eu neste momento estou a usar realloc() e com instância pequenas até vai dando, o problema é com as gigantes.


blogue: migalhasfrog.blogspot.comtwitter: ricardo_pt

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Cr4zYPT

Não sei o que consideras gigante mas podes nao ter memoria suficiente disponivel. Tens de meter uma verificação antes de utilizares memoria

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

A menos que os elementos do teu vector sejam muito pequenos, não vais ter memória para atingir os 100 milhões de elementos. Para essa quantidade entras no território da memória virtual. Convém teres presente que normalmente um 'resize' dum vector é feito copiando todo o conteúdo do vector para um com o novo tamanho; se fizeres isso muitas vezes o computador vai passar o tempo a fazer isso e se esgotares a memória física então... bem podes esperar sentado.

Se precisas mesmo de gerir vectores desse tamanho então não os uses; cria uma lista ligada de páginas de tamanho fixo, que levariam um número fixo de elementos. Sabendo que cada página levaria 'x' elementos seria fácil (e só ligeiramente mais lento do que vectores) determinar e localizar a página com o elemento pretendido. Quando a memória começar a escassear podes despejar páginas para um ficheiro em disco, substituindo a página na memória por uma com apenas um campo a indicar o 'offset' onde procurar a página em disco.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kaub0st3r

Não sei o que consideras gigante mas podes nao ter memoria suficiente disponivel. Tens de meter uma verificação antes de utilizares memoria

Não sei se te referes a memoria fisica do meu pc, mas tem 8gb. como verifico?

A menos que os elementos do teu vector sejam muito pequenos, não vais ter memória para atingir os 100 milhões de elementos. Para essa quantidade entras no território da memória virtual. Convém teres presente que normalmente um 'resize' dum vector é feito copiando todo o conteúdo do vector para um com o novo tamanho; se fizeres isso muitas vezes o computador vai passar o tempo a fazer isso e se esgotares a memória física então... bem podes esperar sentado.

Se precisas mesmo de gerir vectores desse tamanho então não os uses; cria uma lista ligada de páginas de tamanho fixo, que levariam um número fixo de elementos. Sabendo que cada página levaria 'x' elementos seria fácil (e só ligeiramente mais lento do que vectores) determinar e localizar a página com o elemento pretendido. Quando a memória começar a escassear podes despejar páginas para um ficheiro em disco, substituindo a página na memória por uma com apenas um campo a indicar o 'offset' onde procurar a página em disco.

Por acaso tens algum link a explicar o uso de memoria virtual?

thanks a todos


blogue: migalhasfrog.blogspot.comtwitter: ricardo_pt

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bsccara

Não precisas de fazer nada para usar memória virtual pois isso é controlado pelo SO. Imagina que tens 6 GB livres na tua máquina e começas a alocar blocos de 1 MB. Antes de atingires esses 6 GB o SO vai reparar que a memória começa a escassear e vai tentar despejar para disco (para o 'pagefile') blocos de memória pertencentes a outros programas. Quanto mais memória pedires mais blocos vai ele despejar, até que o espaço no 'pagefile' fique cheio (caso em que dá um erro de memória virtual demasiado pequena) ou até esgotares os ~8 GB (tirando o minimo indispensável para o SO). Durante estes despejos o computador ficará exponencialmente mais lento, pois existem sempre múltiplos processos a correr, que irão obrigar a voltar a carregar blocos do disco, criando uma 'swap storm' (quando a luz indicadora do disco está sempre acessa).

A memória virtual do SO deve ser encarada como uma rede de segurança, para evitar que um programa falhe por outros estarem a gastar demasiado memória e não como algo para usar livremente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JD557

Como acedes à memória? É sequencialmente (0,1,2,3...) ou acedes a várias posições(3,1,1000,...)?

No primeiro caso, usa lists. Deve resolver o teu problema.

No segundo caso, não faças realloc com a memória exacta que precisas.

O que te aconselho a fazer é o mesmo que o vector de C++ faz quando fazes push_back (penso que não faz isso quando usas o resize): Faz só realloc em potências de 2.

Ou seja, se quiseres 1000 dados, fazes um realloc de 1024, por exemplo. Assim não tens de fazer tantos reallocs (neste exemplo, podias adicionar 24 elementos ou retirar 488 elementos sem teres de fazer realloc). Obviamente perdes um bocado em memória, mas vai-te compensar muito em velocidade.


MIEIC @ FEUP

http://project557.blogspot.com/ --- Development Blog

Proteja a sua pen: http://lastknight.pt.vu

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kaub0st3r

Como acedes à memória? É sequencialmente (0,1,2,3...) ou acedes a várias posições(3,1,1000,...)?

No primeiro caso, usa lists. Deve resolver o teu problema.

No segundo caso, não faças realloc com a memória exacta que precisas.

O que te aconselho a fazer é o mesmo que o vector de C++ faz quando fazes push_back (penso que não faz isso quando usas o resize): Faz só realloc em potências de 2.

Ou seja, se quiseres 1000 dados, fazes um realloc de 1024, por exemplo. Assim não tens de fazer tantos reallocs (neste exemplo, podias adicionar 24 elementos ou retirar 488 elementos sem teres de fazer realloc). Obviamente perdes um bocado em memória, mas vai-te compensar muito em velocidade.

eu acedo sequencialmente

for (i=ktpos[k];i<ktpos[k+1];i++){
			ccolbeg[k]=(int *)realloc(ccolbeg[k],(ii+1)*sizeof(int));
			ccolbeg[k][ii]=kk;
			for(j=0;j<numrowsp[k];j++) {
				if (ktcplex[i] == indrowsp[j][1]) {
					ccolind[k]=(int *)realloc(ccolind[k],(kk+1)*sizeof(int));
					ccolval[k]=(double *)realloc(ccolval[k],(kk+1)*sizeof(double));
					ccolind[k][kk] = j;
					ccolval[k][kk] = 1;
					kk++;
				}
			}
			ccolind[k]=(int *)realloc(ccolind[k],(kk+1)*sizeof(int));
			ccolval[k]=(double *)realloc(ccolval[k],(kk+1)*sizeof(double));
			ccolind[k][kk] = numrowsp[k];
			ccolval[k][kk] = Area[ktcplex[i]];
			kk++;
			ccolcnt[k]=(int *)realloc(ccolcnt[k],(ii+1)*sizeof(int));
			ccolcnt[k][ii]=kk-contador;
			contador=kk;
			ii++;
		} 

vou experimentar as listas (nunca trabalhei com listas  :))

obrigado  :D


blogue: migalhasfrog.blogspot.comtwitter: ricardo_pt

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.