Uso da memória em java

5 respostas
henriquedamota

A ferramenta que estamos desenvolvendo propõe-se a converter os dados da pesquisa PNAD do IBGE,
de um formato proprietário utilizado pelo programa estatístico denominado SAS, para formatos mais acessíveis.
Dois desses formatos são .xls e .mdb (Excel e Access respectivamente).

Para realizar essa conversão estou utilizando duas APIs para Java que manipulam arquivos Excel e Access.
A API JXL para Excel e a JACKCESS para Access.

Pois bem, o que está acontecendo é que para conversões de grande porte, ou seja, quando o arquivo de dados de entrada possui muitas linhas (o maior possui mais de 400.000), a memória vai enchendo até que aconteça um estouro de memória ou o travamento do sistema operacional, por super utilização da memória disponível.

O problema é que nessas APIs, parece que os dados que estão sendo lidos, vão sendo armazenados na memória
da máquina virtual (VM) até que todo o arquivo com os dados de entrada tenha sido lido e, por isso,
acontece o estouro de memória.

Para a conversão para o formato CSV (separado por vírgulas), esse problema não acontece,
provavelmente por que ele grava uma linha e já elimina os dados da memória para ler a próxima linha.

Bom se alguem puder me dar uma luz agradeço!

Muito Obrigado galera ! absss !

5 Respostas

eduveks

então o único jeito é aumentar a memória do Java, com o:

java -Xmx1000m -jar xpto.jar

henriquedamota

Então cara… aumentei ate o limite por ai e num deu… travou o windows.

Cara num teria como eu fazer como eu fazer de um jeito q não fique enchendo a memória que nem o CSV ? Mesmo que demorasse um pouco mais para processar tudo, mas seria o ideial deixar o sistema com escalabilidade.

Abraços ! :slight_smile:

fviana

cara, vc já deu uma lida na doc. da api pra ver se há alguma configuração que faltou?
tente abrir ou baixar na net o codigo dessas api’s, verifique se há prolemas no codigo e tente extender pra corrigir.

RicardoCobain

Acho que esses APIs devem ter alguma configuração para carregar esse documento em Blocos… de 2 em 2 MB poe exemplo…
Isso existe quando se trabalha com XML.

eduveks

ou fazer tipo um flush()… sei lá, se a API não suporta fica mais dificil, mas ela deve suportar, se não é pegar no código e fazer umas alteraçãozinhoas :lol:

Criado 28 de maio de 2008
Ultima resposta 28 de mai. de 2008
Respostas 5
Participantes 4