Como lidar com uma grande quantidade de dados?

6 respostas
Z

Bom dia, pessoal!

Estou fazendo um trabalho que me foi passado na escola e que está me deixando com um nó na cabeça para resolver :lol:

O problema seria mais ou menos o seguinte:

Tenho uma tabela no MySQL contendo 1.500.000 registros

Nestes registros, cada aluno possui um código que começa, em alguns casos, com os dígitos A1XXX, C2XXX e J3XXX.

Devido a uma mudança de sistema, os códigos que iniciam com A1, C2, J3 serão modificados para X1, X2, X3 respectivamente.

Até aí tudo bem, criei um objeto Aluno e nesse objeto trago os dados do banco (um de cada vez), troco os caracteres iniciais com um String.replace e dou um update da respectiva linha.

O problema é que quando automatizo esta rotina e ela começa a tratar mais de 60.000 registros, logo me aparece a bendita mensagem:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

:cry:

Ja pesquisei sobre esta exception e entendi o porque dela ocorrer, porém existe uma maneira melhor para resolver este algoritmo, de modo que não consumisse tantos recursos da máquina ou uma maneira de liberar os recursos, assim que eles forem finalizados?

Abrs! :smiley:

6 Respostas

ViniGodoy

Você não deveria estar obtendo essa mensagem.
Pode postar seu código?

ViniGodoy

Tópico movido para o fórum de persistência.

vitorh.campos

Sua aplicação deve estar tentando colocar na memória todos os registros da tabela, o que está causando o estouro da área de memória.

Minha sugestão é fazer a alteração diretamente no banco de dados, via SQL (com o comando UPDATE), em vez de deixar a aplicação alterar os registros um por um. Já vi operações ficarem mais de 1.000 vezes (sim, mil vezes) mais rápidas simplesmente trocando um loop de atualizações por um UPDATE que alterava tudo de vez.

Seu caso pode ser resolvido com as funções SUBSTRING e CONCAT do MySQL. Em vez de fazer um loop, você só precisará de 3 UPDATEs, para o A1, C2 e J3.

O link abaixo te dará o caminho das pedras:
http://www.ogenial.com.br/blog/substring-mysql-como-utilizar/

Sucesso!

Z

opa, pessoal

Descobri o que estava havendo.

Essa mensagem estava ocorrendo devido eu não ter fechado a conexão com o banco a cada update.

Fazendo a busca pelos dados, processamento, update no banco e fechando a conexão a cada transação, o problema desapareceu! :lol:

Obrigado pela ajuda e pelas dicas do MySQL :slight_smile:

vitorh.campos

Você abriu e fechou 1,5 milhão de conexões com o banco de dados??? :shock:

Me tira 3 dúvidas, então:

  1. Esse trabalho é para qual matéria da faculdade?
  2. São 1.500.000 registros mesmo?
  3. Quanto tempo levou para atualizar todos os registros?
Z

Bom dia, vitorh

Esse trabalho é para uma matéria de programação.

Na verdade eu deveria ter feito o que você sugeriu e ter feito o update direto pelo banco, mas como queria testar como funciona uma classe DAO, fiz essa gambiarra via programação :lol:

Demorou pra dedeu, cerca de 18h :lol: pra terminar, mas deu pra ter uma idéia do que NÃO fazer via programação…

Abrs.

Obs: Sim, são 1.500.000

Criado 24 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 6
Participantes 3