publicstaticvoidaddEmail(Stringarquivo)throwsIOException{//ADICIONA EMAILS NO ArrayListBufferedReaderleitor=newBufferedReader(newFileReader(arquivo));Patternp=Pattern.compile(expEmail);for(Strings1=leitor.readLine();s1!=null;s1=leitor.readLine()){Strings=s1.toLowerCase();Matcherm=p.matcher(s);while(m.find()){lista.add(i,m.group());i++;}}System.out.println(lista.size());}
T
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?!
M
marcos.junqueira
quantas coisas vc tah colocando ai dentro?? 700 mil??? credo… vai estourar memoria mesmo…
pq não processa em lotes??? tipo de 1000 em 1000
T
thiago.correa
Pelos meus cálculos são 1.796.227 e-mail, toda vez que o List não suporta mais elementos ele faz uma cópia dele mesmo para um outro Array de tamanho maior, e essa operação é custosa, reveja o teu código.
A
Alkamavo
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?!
Como pode estourar a JVM se o Java tem o GarbageCollection? :oops:
B
bertu
Olha nao da pra processar em lotes, pq eu preciso retirar os repetidos, e pode ser que no lote 1 e lote 2 tenha os msm emails, dae como vou saber q no lote 1 tem o msm email q no lote 2 ! por isso junto tudo num arraylist só, ordeno o arraylist e retiro os repetidos!
T
thiago.correa
Alkamavo:
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?!
Como pode estourar a JVM se o Java tem o GarbageCollection? :oops:
:shock:
Simples o GC não previne o estouro de memória, foi gerado mais objetos do que o GC pode coletar, e a memória alocada para a JVM é pequena (algo de 12mb por default se não me engano), além do mais que o GC só recolhe da memória objetos que não são mais referenciados, ou seja, o array list dele está sendo referenciado e em uso, e crescendo em um ritmo absurdo e com uma quantidade muito grande de elementos, o mal uso de recursos computacionais, (laços de repetições mal feitos, recursividade sem fim, grande coleções de objetos, abertura de recursos como arquivos e conexões com o banco de dados sem a após o uso a sua liberação etc…) podem ocasionar memory leaks.
T
thiago.correa
Olhe, daí fica mais fácil, então antes de adicionar na lista, veja se já existe! Ou use as implementações da classe Set que não permite, objetos repetidos
Exemplo
Set<String> s = new LinkedHashSet<String>(3);
s.add("[email removido]");
s.add("[email removido]");
s.add("[email removido]");
System.out.println(s.size());
for (String st : s ) {
System.out.println(st);
}
Assim você previne dados repetidos e possível estouro de memória.
A
avencurt
Tchê, que tal usar um BD para colocar este monte de informações?
Só para lembrar um SGBD não permite registros duplicados, então insira os dados no BD e depois leia o que está no Bd, pois os duplicados serão naturalmente eliminados.
T
thiago.correa
avencurt:
Tchê, que tal usar um BD para colocar este monte de informações?
Só para lembrar um SGBD não permite registros duplicados, então insira os dados no BD e depois leia o que está no Bd, pois os duplicados serão naturalmente eliminados.
:shock: Cara, como você me diz uma coisa dessas?! Claro que banco de dados permite registro duplicados, além do mais, se o cara recebeu esses arquivos e tem que popular para um banco, ou um outro lugar, ele vai sair digitando na mão?!
A
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.
T
tiago_stos
thiago.correa:
avencurt:
Tchê, que tal usar um BD para colocar este monte de informações?
Só para lembrar um SGBD não permite registros duplicados, então insira os dados no BD e depois leia o que está no Bd, pois os duplicados serão naturalmente eliminados.
:shock: Cara, como você me diz uma coisa dessas?! Claro que banco de dados permite registro duplicados, além do mais, se o cara recebeu esses arquivos e tem que popular para um banco, ou um outro lugar, ele vai sair digitando na mão?!
Bom, apesar dele estar errado em dizer q BD não aceita dados duplicados, concordo com o avencurt que seria uma boa utilizar um banco de dados para ajudar nesse trabalho. Para jogar os dados no BD é só fazer um loop para ler o arquivo e para cada linha lida é só fazer um insert no banco (talvez exista jeito mais fácil, mas eu não conheço). Uma vez com os dados no banco é só fazer uma consulta eliminando dados duplicados.
B
bertu
nao posso usar bd nao! vou tenta fazer da maneira que o thiago.correa disse, alias eu ja havia postado algo semelhante e me disseram pra usar o set! Vou ver aqui daqui pokim posto novamente vlww
T
tiago_stos
Se o problema for o de não poder instalar um bd, utilize o HSQLDB. Não precisar ser instalado e é bem fácil de se utilizar.
na verdade eu poderia adicionar e salva tudoo em um arquivo, e depois retirar todos repetidos! o problema que o arquivo fica com 1milhao pra mias de linhas! como ranca o repetidos ?
T
tiago_stos
Cara, acho q nesse caso vc não vai conseguir fugir de usar um banco de dados. Ou nem é preciso, se não me engano o HSQLDB consegue trabalhar com arquivo de texto como se fosse um banco de dados utilizando um um arquivo texto com os campos definidos.
Uma dica de como vc poderia fazer seria utilizando o HSQLDB lendo o arquivo já existente e jogando os dados em um novo arquivo linha por linha, porém antes de incluir uma nova linha você faz uma consulta para ver se a linha já existe no novo arquivo, caso exista é só descartar essa linha.
F
fantomas
Por que não o HSQLDB, Derby, etc…?
flws
B
bertu
nao quero usar bd! queria mexer com arquivo txt
T
thiago.correa
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.
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!
T
thiago.correa
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?!
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-Xmx15mMyApp
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!
T
thingol
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:
Se você estiver usando Windows, você pode usar o sort do Cygwin ou de UnxUtils.
OK?
A
avencurt
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.
B
bertu
nao vou conseguir fazer oque quero no java entao ?
F
fantomas
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.
flws
T
thingol
É 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.
A
avencurt
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.
Passem o mate ou sigo falando
T
tiago_stos
:shock: Como diz um famoso dito popular: “pq simplificar se vc pode complicar?” :twisted: