Estou fazendo o parse de um arquivo de log e através de uma expressão regular, estou inserindo grupos da expressão em colunas de uma tabela no banco de dados. Cada linha no arquivo é um registro no banco. No começo a inserção é rápida, até mais ou menos uns 2000 registros, quando passa disso começa a ficar lento. Até uns 18000 é aceitavel, mas quando passa disso começa a ficar beem lento… o arquivo aqui tem por volta de 38000 linhas… alguém ai sabe algum macete para otimizar a leitura e a inserção no banco?
Amigo, o que muito provavelmente está acontecendo eh que voce esta entupindo a memória da maquina com dados.
Há difersas soluções, voce pode quebrar o montante de dados em arquivos menores e processá-los separadamente.
voce pode também fornecer mais memória para a aplicação, rodando sua aplicação num PC sem muitos processos para roubar memoria RAM. Mas esta solução não é das mais viáveis pois so vai protelar a falta de memória RAM.
Voce pode também otimizar as inserções no banco de dados, removendo o auto-commit simplesmente pondo um Begin; no inicio e um Commit; depois de um bolo de Insert Into. Isso vai agilizar bastante a sua aplicação.
ignacio83
Se estiver utilizando hibernate ou JPA?
Se a resposta for sim, você pode fazer de n em n registros:
...if(i%1000){.flush();//Descarrega os comandos armazenados (insert,update,select...).clear();//Limpa o cache}...
Link_pg
No caso eu estou com o auto-commit false, e tenho um numero configurável de executeUpdate num arquivo de properties (Ex.: a cada 1000 linhas, executa um commit). O caso é que nem tudo estava sendo logado no textArea, e estava acontecendo um NumberFormatException que travava o processo e não estava sendo logado…