Jump to content
Sign in to follow this  
pedrosorio

Tentar alocar 2GB

Recommended Posts

pedrosorio

Olá. Estou a tentar alocar cerca de 2GB de RAM e dá-me std::bad_alloc(), apesar deste computador ter 8GB RAM (Windows 7 - 64bit).

int NS=5369, NF=185107;
vector<short int> fsorted;
fsorted.resize(NF*NS);

Talvez seja relevante para o problema: estou a usar cygwin.


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
pikax

deve ultrapassar o max_size do vector.

Uma forma de passar esse problema é assim:

int NS=5369, NF=185107;
vector<vector<short int> > fsorted;
fsorted.resize(NS);

for (int i = 0; i < NS; ++i)
        ff[i].resize(NF);

Não é a melhor forma, mas já não manda a exception, outra forma de fazeres, mas não consegues guardar todos os valores é fazer o try catch

try
    {
      //ciclo para guardar os elementos
    }
    catch (std::bad_alloc &e)
    {
        cout<<"error"<<endl;
    }

mas desta forma não conseguiras guardar os elementos todos

Espero ter ajudado


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Localhost

Não tenho a certeza mas... A RAM não é um composto individual, é dividida em duas partes: stack e heap. Provavelmente estás a tentar alocar memória na stack, como o espaço não é reservado todo para a stack (até penso que tenhas mais espaço na heap), logo isso vai-te lançar esse erro.

Já agora, http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap.


here since 2009

Share this post


Link to post
Share on other sites
pedrosorio

Era uma boa ideia, por acaso nem me lembrei de verificar o max_size(), no entanto não seria solução porque  o código original era exactamente o que definiste (sem o try catch porque preciso mesmo de guardar todos os valores) só depois é que alterei para a alocação de um vector de uma só vez.

Acabei por perder imenso tempo nisto (devia mas é ter instalado linux na máquina, que não é minha, mas pelo menos demorava menos tempo :(), de facto o cygwin tem essa barreira, mas consegui usar o compilador para 64-bit do mingw com cygwin, e este menino já está a usar os 8GB como deve ser =)

Para referência futura:

Em vez de instalar no item Devel, o que está relacionado com gcc-core, instala-se o que está em mingw64-x86_64-gcc-core. De seguida é necessário alterar os nomes dos binários em C:\usr\bin\x86_64-w64-mingw32-gcc para gcc, e o mesmo para g++, se quisermos usá-los com os nomes habituais.

Site do mingw-64bit

Thread que fala da necessidade de adicionar mais variáveis ao path do cygwin

O path do cygwin está definido no ficheiro profile em C:\cygwin\etc\

Obrigado!

P.S.:

Não tenho a certeza mas... A RAM não é um composto individual, é dividida em duas partes: stack e heap. Provavelmente estás a tentar alocar memória na stack, como o espaço não é reservado todo para a stack (até penso que tenhas mais espaço na heap), logo isso vai-te lançar esse erro.

Já agora, http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap.

Nah, tudo o que seja STL e companhia está feito com memória dinâmica que é alocada sempre na heap, se não estou em erro.


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
pikax

Não tenho a certeza mas... A RAM não é um composto individual, é dividida em duas partes: stack e heap. Provavelmente estás a tentar alocar memória na stack, como o espaço não é reservado todo para a stack (até penso que tenhas mais espaço na heap), logo isso vai-te lançar esse erro.

Já agora, http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap.

O alloc do vector lança bad_alloc sempre que ultrapasse o max_size:

fsorted.max_size();

Pelo o que me lembro, a heap é para trabalhar com apontadores, tentei usar heap e deu o mesmo erro

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int NS=5369, NF=185107;
    vector<short int> *fsorted;
    fsorted=new vector<short int>;

    fsorted->reserve(NF*NS);
   
    fsorted->clear();
    delete fsorted;

}


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Localhost
Nah, tudo o que seja STL e companhia está feito com memória dinâmica que é alocada sempre na heap, se não estou em erro.

Mesmo assim, lembra-te que o teu programa não é o único a ser utilizado no momento, lembra-te que também tens o sistema operativo para além de todas as outras aplicações. Alocares assim tanto espaço é normal que dê barraca...


here since 2009

Share this post


Link to post
Share on other sites
pikax

Mesmo assim, lembra-te que o teu programa não é o único a ser utilizado no momento, lembra-te que também tens o sistema operativo para além de todas as outras aplicações. Alocares assim tanto espaço é normal que dê barraca...

Lembro-me de ter feito um programa que consumia a memoria do PC, no windows 7 e no vista(que "sem programas" a rodarem) consonem  cerca de 40% a 60% da RAM do computador, e após rodar o meu programa a memoria descia para os 20% a 25%, claro que subia para o normal, mas durante 1 minuto ficava a consumir pouco, isso significa que o windows irá gerir a memória dos outros programas(aka retirar memoria se for necessário).

Vou ver se encontro o programa, e depois posto aqui


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
SirDave

A minha pergunta é um bocado offtopic, mas para que queres alocar 2GB? Parece-me imenso, nunca usei malloc( para nada acima de 10MB :(


Be nice to see your eyes, blink them from time to time to relax your retina when using the computer. Blink now!

Share this post


Link to post
Share on other sites
pikax

o código que falei(apesar de não o ter encontrado) é mais ou menos assim

#include<iostream>

using namespace std;

int main()
{
    int *pint;
    int i=0;

    try
    {
        while( pint=new int[999])
        {
            pint=0;
            i++;
        }
    }
    catch(...)
    {
        cout<<"Memoria cheia"<<endl;
        cout<<"Limite atingido = "<<999*i*sizeof(pint)<<" B"<<endl;
        cout<<"Limite atingido = "<<999*i*sizeof(pint)/1024<<" KB"<<endl;
        cout<<"Limite atingido = "<<999*i*sizeof(pint)/1024/1024<<" MB"<<endl;
    }
    cin>>i;//para parar o programa
}

EDIT: para ocupar mesmo "toda" a RAM disponível tem-se que usar outro tipo de variáveis porque o int é alocado diferente do que float,etc...


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
pedrosorio

Mesmo assim, lembra-te que o teu programa não é o único a ser utilizado no momento, lembra-te que também tens o sistema operativo para além de todas as outras aplicações. Alocares assim tanto espaço é normal que dê barraca...

Já expliquei a razão pela qual estava a dar barraca (limitações do cygwin, que não utilizava o sistema 64-bit como devia ser para alocar memória). O meu P.S. era só para te explicar porque é que o problema nunca seria da stack.

A minha pergunta é um bocado offtopic, mas para que queres alocar 2GB? Parece-me imenso, nunca usei malloc( para nada acima de 10MB :(

Estou a fazer processamento de imagem e tenho que escolher as 100 melhores características (uma característica é uma função que pode ser calculada para cada imagem) entre 185107 para classificar cada uma de 5369 imagens como sendo "positiva/negativa". A classificação de uma imagem de acordo com uma característica faz-se estabelecendo um valor, se a característica for maior/menor que este valor, a imagem é positiva. O algoritmo é adaptivativo, ou seja, depois de escolher x características e respectivos valores, tenta-se escolher uma característica x+1 e um valor que classifique bem as imagens em que os outros erram mais - no fundo tenta-se minimizar um determinado erro. É possível achar a característica x+1 eficientemente se ordenarmos as imagens de acordo com a valor de cada uma das características que ainda não foram seleccionadas.

Se não guardar o valor de cada característica para cada imagem (mais precisamente, o que faço é guardar a ordem das imagens de acordo com cada característica) cada vez que tiver que determinar uma das "características óptimas" (ou seja, 100 vezes) tenho que as calcular as 185107 em todas as 5369 imagens, e fazer 185107 sorts das 5369 imagens. Caso típico de tradeoff entre memória e processamento. Uso uns quantos gigas de RAM mas consigo treinar o classificador em poucas horas em vez de levar uns dias... =)


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.