[quote=avencurt]Qual SGBD tu usas que permite registros duplicados?
Ou ele está digitando 700mil endereços de e-mail, ou eles vem de alguma outra fonte, então basta ele direcionar o destino para o BD.[/quote]
Volto a repetir qualquer banco de dados permite registro duplicados, a não ser que uma determinada coluna seja chave primária, daí sim concordo que não pode haver registro repetido, agora, afirmar categoricamente que um banco de dados não aceita registros duplicados, daí é demias!
[quote=thiago.correa]Estourou o limite de memória da tua JVM
Dá uma pesquisada sobre o erro que possivelmente você vai encontrar como aumentar esse tamanho!
Só por curiosidade qual é o tamanho desse teu ArrayList?![/quote]
Cara então reinterando o que disse, o problema e o tamanho da memória alocada para a JVM, rode seu programa com a seguinte linha de comando
java -Xms5m -Xmx15m MyApp
Trocando os valores numéricos de acorodo com a sua máquina, o priméiro é o valor mínimo o segundo é o máximo, tente aumentar esses valores gradativamente, de repente 64, 128, 256 até você conseguir rodar seu programa, se não adiantar, então você terá que achar uma outra maneira, pois o volume de dados é muito grande!
P.S.: se você estiver usando uma IDE, procure a opção java arguments quando for colocar para rodar!
Se seu arquivo tem um milhão ou mais de linhas, você pode ordená-lo com um comando do Unix chamado “sort” e solicitar a remoção das linhas repetidas. Por exemplo:
Pessoal, como aqui é um lugar para aprender e com o objetivo de eu parar de falar bobagens, me expliquem como vocês conseguem duplicar tuplas no banco de dados? E se possível também me digam em qual SGBD vocês fazem isso.
O louco bertu! Que loucura é essa por um arquivo texto rsrsrssr?
Então vejamos, vc tem um arquivo texto gigante que não cabe na memória e precisa retirar as redundancias; associado a isso vc QUER por que QUER resolver a coisa com arquivo texto.
A idéia que me ocorreu para resolver isso foi uma muito utilizada a +ou- 25/30 anos atraz (não sou desta época eu juro),havia pouca memória naquele tempo; é o seu caso rsrsrsr. Os caras chamavam a técnica de Balance Line, todo programador que sabia fazer isso bem se achava o máximo hahahah.
A idéia é a seguinte:
Abrir o arquivo original (este que vc tem ai)
Criar outro arquivo (temporário) com a mesma estrutura contida no original.
Ler um registro (no seu caso uma linha) no arquivo original.
Verificar se a linha lida no passo 3 existe no arquivo temporário.
Se a linha não existir no arquivo temporário, incluir caso contrario voltar ao passo 3.
Quando a leitura do arquivo original terminar fechar os dois arquivos (original, temporario)
Excluir o arquivo original
Renomear o arquivo temporário com o mesmo nome do arquivo original.
Abrir o arquivo original.
Continuar os próximos passos da execução do sistema.
Acho que é + ou - isso, pode ver que o uso de memória foi mínimo, o problema é a velocidade.
P.S. Na técnica Balance Line na verdade está incluida a idéia de ordenação das informações, como não é o seu caso ficou de fora.
É possível ordenar milhões de linhas no Java, mas isso requer você usar um recurso chamado “merge”.
Basicamente, você lê uma quantidade não muito grande de linhas (digamos 100.000) , ordena-as e as grava em um arquivo temporário 001.
Aí você lê mais 100.000 linhas, ordena-as, e as grava em um arquivo temporário 002.
Faça isso até acabarem as linhas do arquivo original.
Você terá uma coleção de arquivos temporários 001, 002 etc.
Depois disso, você abre todos os arquivos ao mesmo tempo, e lê a primeira linha de cada um deles.
Escolha a menor linha entre todas as primeiras linhas, e grave essa linha. É como se fosse uma votação em que o menor é que ganha.
Aí você pode ler a segunda linha do arquivo escolhido, e continua comparando com a primeira linha dos outros. Você grava a menor linha de todos os arquivos abertos.
E assim por diante, até acabarem todas as linhas de todos os arquivos.
Aos “Tiagos”:
Talvez eu tenha cometido um erro conceitual ao dizer que o BD registros não podem ser duplicados, quando eu deveria ter dito que tuplas não podem ser repetidas em um BD.
Quanto à essa questão de colocar PK para diferenciar as tuplas, vai depender de qual campo foi escolhido para ser a PK.
Então se a tabela for mal modelada alguém coloca a PK em um campo de baixa cardinalidade e será necessário fazer ajustes e provavelmente escolher mais campos para compor a PK.