Matrizes muito grandes

4 respostas
A

Boa noite.

Preciso fazer um trabalho onde utilizarei duas matrizes muito grandes mais ou menos 10000X10000. Em linguagem C conseguir utilizar esse tamanho através de ponteiros e alocação dinâmica, em Java da a um erro de compilação dizendo que a estrutura atingiu a área de heap do java.
O tipo de dado da matriz é int.

Se alguém puder me ajudar ficarei muito grato.

4 Respostas

B

Vejamos, 10000x10000 é um array de 100 milhões de posições, contando que int são 4 bytes, vai uns 381 MiB para alocar só uma delas, provavelmente mais de tiver algo que não esteja considerando.

Duas soluções:

  1. Aumentar a memória do heap (-Xmx800m, leia o manual da JVM)
  2. Procurar uma implementação de Matriz que se adeqüe ao teu problema, provavelmente você não poderá fazer os calculas com tudo em memória. Veja: http://math.nist.gov/javanumerics/
L

Se sua matriz tiver bastante elementos nulos, o ideal é criar uma matriz esparsa. Você pode ver diversas implementações procurando por “Matrizes esparsas” no Google.

[]'s

A

Bruno Laturner:
Vejamos, 10000x10000 é um array de 100 milhões de posições, contando que int são 4 bytes, vai uns 381 MiB para alocar só uma delas, provavelmente mais de tiver algo que não esteja considerando.

Duas soluções:

  1. Aumentar a memória do heap (-Xmx800m, leia o manual da JVM)
  2. Procurar uma implementação de Matriz que se adeqüe ao teu problema, provavelmente você não poderá fazer os calculas com tudo em memória. Veja: http://math.nist.gov/javanumerics/

dei uma olhada em como alterar a memória da jvm, tenho dois gigas de ram, coloquei em -Xms300m -Xmx800m, o console aceitou, apareceram os comandos do comando java, mas mesmo assim continua o erro.
vou aproveitar e dar uma olhada sobre as matrizes esparsas.

no meu caso a matriz vai ser totalmente preenchida, onde farei a multiplicação entre elas, estou fazendo um projeto da facu, sobre projeto e análise de algoritmos.

Muito obrigado pela ajuda de vocês.

T

Para fazer uma multiplicação, você vai precisar de pelo menos 3 matrizes (A x B -> AB), não?
Então você vai ter de alocar pelo menos 1.3 GB (100 MB para seu programa, e 1.2 GB para suas 3 matrizes).

O seu problema é que o Java não aceita alocar mais de 1.5 GB em uma máquina rodando um sistema operacional de 32 bits.

Você precisa usar um sistema operacional de 64 bits e uma JVM de 64 bits para poder aproveitar os 2GB de sua máquina.

Criado 10 de abril de 2009
Ultima resposta 13 de abr. de 2009
Respostas 4
Participantes 4