Como manipular objetos grandes na memória?

8 respostas
S

Boa tarde!

Estou utilizando o framwork poi para gerar planilhas xlsx, porém minha planilha tem mais de 200000 linhas e, quando vou criar a mesma, ao adicionar aproximadamente 106000 linhas tenho um erro de java heap space.
Sei que isso acontece pois meu objeto atingiu o limite do heap space porém, a planilha precisa ter este tamanho todo. Alguém tem alguma sugestão sobre como manipular um objeto tão grande na memória?

8 Respostas

Andre_Brito

Você tem certeza que é a POI que tá comendo a memória assim? Pra ter certeza, usa algum profiler. Você pode usar o jconsole (vem com o jdk) pra verificar o consumo de memória (ele não é bem um profiler, é só uma ferramenta de monitoramento).

Manipular eu não sei, mas você pode aumentar o tamanho que o Java pode alocar (por meio do atributo -Xmx, tem tempo de execução). Dá uma olhada nesse post do blog da Caelum.

Andre_Fonseca

samurai:
Boa tarde!

Estou utilizando o framwork poi para gerar planilhas xlsx, porém minha planilha tem mais de 200000 linhas e, quando vou criar a mesma, ao adicionar aproximadamente 106000 linhas tenho um erro de java heap space.
Sei que isso acontece pois meu objeto atingiu o limite do heap space porém, a planilha precisa ter este tamanho todo. Alguém tem alguma sugestão sobre como manipular um objeto tão grande na memória?

oi,

uma das alternativas é usar uma solução de cache, recentemente usamos o infinispan da JBoss

existem muitas outras

se não exigir nada muito complicado você mesmo poderar codificar o seu cache, usando por exemplo WeakReferences

[]´s

bruno.costa

você não pode descarregar isso no disco ?

S

Até posso, o problema é durante a criação da tabela que o objeto workbook que contém a sheet fica juito grande durante a criação da tabela e ai estoura.
Se eu pegar um pedaço e escrever no disco, ler de novo adicionar e escrever de novo, não vai dar no mesmo?

bruno.costa

Até posso, o problema é durante a criação da tabela que o objeto workbook que contém a sheet fica juito grande durante a criação da tabela e ai estoura.
Se eu pegar um pedaço e escrever no disco, ler de novo adicionar e escrever de novo, não vai dar no mesmo?

vc pode postar o código da prate da criação ?

Andre_Fonseca

Até posso, o problema é durante a criação da tabela que o objeto workbook que contém a sheet fica juito grande durante a criação da tabela e ai estoura.
Se eu pegar um pedaço e escrever no disco, ler de novo adicionar e escrever de novo, não vai dar no mesmo?

oi,

como foi dito, primeiro voce tem que ter certeza de que é o tamanho da planilha que está estourando a memória, depois você pode tentar aumentar a memória e ver se resolve, gravar em disco é outro coisa, que pode até mesmo ser mais custoso, outra idéia é usar um cache em memória como eu falei acima, você pode clusterizar este cache se precisar também

[]´s

S

Até posso, o problema é durante a criação da tabela que o objeto workbook que contém a sheet fica juito grande durante a criação da tabela e ai estoura.
Se eu pegar um pedaço e escrever no disco, ler de novo adicionar e escrever de novo, não vai dar no mesmo?

oi,

como foi dito, primeiro voce tem que ter certeza de que é o tamanho da planilha que está estourando a memória, depois você pode tentar aumentar a memória e ver se resolve, gravar em disco é outro coisa, que pode até mesmo ser mais custoso, outra idéia é usar um cache em memória como eu falei acima, você pode clusterizar este cache se precisar também

[]´s

Opa, tudo bem?
Realmente é no momento da criação da tabela.
U uso da memória pula dos 100mb (praticamente o estado que o jboss se encontrava quando terminou de iniciar) ao inserir as primeiras linhas, aos 1028mb que é quando atinge o limite de linhas, que eu consegui fazer chegar a 130000, e então estoura dá o estouro do heap space.
Vou tentar utilizar o cache. Obrigado!

S

Consegui fazer algumas melhorias porém só consigo inserir 130000 linhas e o engraçado é que o array de bytes tem pouco mais que 3mb, porém, a jvm chega a usar 1048m de memória quando estou inserindo os dados na planilha. Será que isso é normal? É uma caracteristica do pois acabar com a memória? Alguém conhece outra api pra se trabalhar com xlsx?

Criado 17 de novembro de 2010
Ultima resposta 24 de nov. de 2010
Respostas 8
Participantes 4