Out of memory ao ler arquivo de 5 gb

Boa tarde, estou com um problema de

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

ao fazer a leitura de um arquivo de aproximadamente 10 milhoes de linhas e com o tamanho
de quase 5 gb.

O estranho é que, ao apenas fazer a leitura eu não tomo erro, mas ao realizar um String.split na linha
eu tomo um erro de out of memory

	private static boolean procuraOptico(String s){
		String[] split = s.split( "\|" );
		boolean isOptico = false;
		
		if(split.length < 47){
			System.err.println("Linha inválida: \n" +s);
			isOptico = false;
		}else{
		
			if(split[47].equals("S")){
				isOptico =  true;
			}else{
				isOptico =  false;
			}
		}
		
		split = null;
		
		return isOptico;
}

[code]
BigFile bigFile = new BigFile(arquivo);

		System.out.println("Lendo arquivo...");
		int i = 0;
		int jFixo = 500000;
		int j = jFixo;			
		
		Opticos opticos = new Opticos(350000);

for(String s : bigFile){

			if(procuraOptico(s)) 
				opticos.add(s);	
			
			if(++i == j){
				System.out.println("Lidos: " + i + "|Opticos: " + opticos.quantidade);
				j = j+jFixo;
			}
		
		}[/code]

ao comentar o trecho
if(procuraOptico(s))
opticos.add(s);
[/code]

eu paro de tomar o erro.

O erro sempre da quando ele esta por volta do 6.000.000, e aponta para o metodo split.

Alguma ideia?

Olá,
tinha visto o problema hoje à tarde, mas acabei esquecendo de responder. Pelo código que você comentou que está dando problema é bem provável que não haja memória suficiente para todas as strings que procuraOptico() retorna como verdadeiro. Se for isto você deverá bolar uma forma que gaste menos memória, tal como só o número da linha, por exemplo.

[]'s

Talvez trocar String por StringBuffer resolva seu problema, porém você teria que pensar em outra maneira de fazer o “split”.

Java IO não tem performance muito boa para arquivos grandes. Para isso use o NIO.

E, principalmente, não carregue todos os dados em memoria, pois se você tem um arquivo de 5G e carregar tudo em memoria, você precisará dos 5G do arquivo + a quantidade de memoria do SO. O que esse método faz? ele procura por alguma palavra? Então já procurando tal palavra no arquivo em realtime, e assim que encontrar, saia fora do arquivo, cuidando para fechar todos os streams.