Processar um arquivo grande em uma transação?

Oi pessoal, eu trabalho em uma aplicação que trabalha com processamento de arquivos. Um dos desafios agora é importar e ler um arquivo de mais de 400mb, com mais de 20 milhões de linhas. A minha duvida é saber qual das duas opções é a melhor considerando que estou usando jpa.

  • abrir uma única transação e dar um persist gravando com o cascade todos os objetos
  • controlar manualmente as transações, comitando a cada XXX registros

A leitura do arquivo populando meu objeto nao gasta nem dois minutos. Mas minha inclusão, do momento que mando gravar, gasta quase 20 minutos.

Gostaria de diminuir esse tempo, sendo que o que esta funcionado hoje é usando o cascade.

Todas as opiniões são bem vindas nessa hora kkkkk

Falows

quantos arquivos desse vc precisa processar por dia em média?

Praticamente 1 por dia o tamanho pode variar, mas sempre vai ser grande acupando a casa dos milhoes de registros

javaCBA,
Vc esqueceu de citar qual banco(e versão) vc usa.Até pq alguém acaba citando algo para você utilizar(como SQL loader do Oracle), e descobre que você está com outro banco…
Não vou mentir, 20 milhões(e 400MB) é osso, mas eu já fiz importação com insert(só no JDBC + executeBatch) para um milhão de registros(com 20 colunas) e demorou menos de 10 segundos(em um i7 desktop) num oracle 10g, mas eram só 20MB de dados.

Eu seria um dos que citaria uma ferramenta específica do banco de dados para esse tipo de carga.

Falando em volume, já vi arquivos de 600MB sendo importados em poucos minutos com uma ferramenta dessas ( no caso o sql server).

Se a regra de negócio não for muito complexa, acho que é uma solução mais simples, rápida e robusta pra esse tipo de tarefa.

Eu realmente não acredito que 20 minutos de maquina/dia sejam um impeditivo para a maioria dos casos, mas como não conheço o domínio não tenho nem como expressar minha opinião nesse caso.

Todas as vezes que eu precisei otimizar acesso ao banco de dados, inevitavelmente tive que abandonar o ORM e apelar pra SQL na mão. Considere essa hipótese.

O banco é postgres. E quanto aos 20 min, atrapalha sim uma aplicação que precisa de disponibilidade 24x 7 com boa performance.

http://www.postgresql.org/docs/current/interactive/populate.html