Bom dia,
Alguém sabe se o problema de estouro de memória quando se usa o POI para ler arquivos .XLS ou .XLSX muito grandes já foi resolvido?
Ou então se existe outra API que dê conta do recado?
Hoje estou usando a JXL, mas ela só da conta de arquivos .XLS (95 - 2003).
A biblioteca JExcel trabalha só com o formato xls, e possui uma opção de configuração na qual você cria um arquivo temporário, evitando assim estouros de memória.
No caso do POI, caso não exista esta opção, você pode pensar em um algoritmo mais complexo para evitar este problema, como por exemplo, adotar uma estratégia do tipo “dividir para conquistar”.
Gere o seu arquivo Excel em pedaços e depois os una em um só para situações nas quais precise gerar um documento gigante. Neste tipo de situação, no entanto, antes de fazer este tipo de alteração mais extrema, costumo verificar se não estou escrevendo código com leaks de memória (em 90% dos casos, é exatamente esta a situação)
Bom dia Kicolobo,
Você descreveu esta ação para escrever, mas no caso de leitura, como pode ser feito?
Oi Jucelio,
você pode fazer a mesma coisa. Como no POI, você passa um Stream, você pode ir salvando em arquivos temporários também o que está lendo de N em N linhas, por exemplo. Assim mantém o tamanho da coisa decente.
Outra alternativa, é usar o java NIO. Há como você criar por exemplo um buffer de memória que não é gerenciado pela JVM, mas pelo SO. Mas novamente, você apenas estaria transferindo o problema para o sistema operacional.
Você teria um exemplo da Stream?
Oi jucelio,
neste caso, não. Mas repare que quando você abre algo com o POI, passa pra ele um Stream como parametro.