Erro com Array

Oque significa esse erro ? ArrayList chegou no tamanho maximo ? qual tamanho maximo ?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.ArrayList.ensureCapacity(Unknown Source)
        at java.util.ArrayList.add(Unknown Source)
        at filterMail.addEmail(filterMail.java:80)
        at filterMail.main(filterMail.java:142)

puis para imprimir arraylist.size() e mostrou o tamanho! nao passou de 700mil !! acho que nao e problema no tamanho! Ou eh ?

 Adicionando no Array

Arquivo : dados.sql
62900
Arquivo : clientes.sql
499029
Arquivo : antigos.sql
564350
Arquivo : dados1.sql
564350
Arquivo : backup.sql
669948
Arquivo : novo_dados.sql
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.ArrayList.ensureCapacity(Unknown Source)
        at java.util.ArrayList.add(Unknown Source)
        at filterMail.addEmail(filterMail.java:79)
        at filterMail.main(filterMail.java:142)

meu metodo de adicionar no array

	public static void addEmail(String arquivo) throws IOException { //ADICIONA EMAILS NO ArrayList
		BufferedReader leitor = new BufferedReader(new FileReader(arquivo));
		Pattern p = Pattern.compile(expEmail);
		for(String s1 = leitor.readLine(); s1 != null; s1 = leitor.readLine()) {
			String s = s1.toLowerCase();
			Matcher m = p.matcher(s);
			while (m.find()) {
				lista.add(i, m.group());
				i++;
			}
		}
		System.out.println(lista.size());
	}

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?!

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

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.

[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]

Como pode estourar a JVM se o Java tem o GarbageCollection? :oops:

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!

[quote=Alkamavo][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]

Como pode estourar a JVM se o Java tem o GarbageCollection? :oops: [/quote]

: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.

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("tcorrea@seila.com"); s.add("tcorrea@seila2.com"); s.add("tcorrea@seila.com"); 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.

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.

[quote=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.[/quote]

: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?!

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=thiago.correa][quote=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.[/quote]

: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?![/quote]

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.

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

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.

ehh nao deu ainda ! :frowning:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.LinkedHashMap.createEntry(Unknown Source)
        at java.util.LinkedHashMap.addEntry(Unknown Source)
        at java.util.HashMap.put(Unknown Source)
        at java.util.HashSet.add(Unknown Source)
        at test.addEmail(test.java:83)
        at test.main(test.java:108)

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 ?

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.

Por que não o HSQLDB, Derby, etc…?

flws

nao quero usar bd! queria mexer com arquivo txt