Melhorar performace de leitura de dados (loop while, int array)

5 respostas
rock-skull

Olá.

Seguinte. Preciso ler dados de um CSV. O problema é que são muitos dados. Variam entre 35.000 e 130.000 mas a média é 65.535. Cada dado desse é um double, normalmente 5 casas total, sendo 3 decimais. Eu preciso pegar esse double e transformar ele em um inteiro (com 5 casas decimais, elimenando a vírgula).

Eu tenho 3 linhas no CSV que eu leio com inormaçoes com labels (Ex: altura,1.67) e a quarta linha desse CSV é ‘dados’. A partir de dados, cada linha é um dado. Esses dados são salvos num array de int (Não, eu não posso mudar isso no momento, talve futuramente, dê pra colocar isso numa Collection, mas no momento preciso usar array de int).

O código que lê os pontos é mais ou menos assim (trecho do código):

try {
     BufferedReader in = new BufferedReader(new FileReader(dataFile));
     String nextLine = "";        
     countData = 0;
     int [] points = new int[size];
     while((nextLine = in.readLine())!=null){
          try{
               points[countData] = (int) (Double.parseDouble(nextLine.trim())*1000.0);
               countData++;
          }catch(NumberFormatException e){
               continue; //ignora os dados não convertindos (nunca acontece, mas caso aconteça, ignora)
          }
} catch (FileNotFoundException e) {
	logger.error("Error reading data. "+dataFile.getName()+" not found");
	return null;
}catch(IOException ioe){
	logger.error("Error reading data. Could not read "+dataFile.getName());
	return null;
}catch(NoSuchElementException e){
	logger.error("Error reading data. Malformed file");
	return null;
}

Eu não sei se é possível, mas tem alguma forma de melhorar a performace desse código? Com 65.353 dados, ele leva uma média de 1.3 segundos para popular esse array.

E também se tem como melhorar a performance disso com Collections ou outros meios. Como disse, no momento preciso usar array de int, mas futuramente poderei mudar isso.

Desde já agradeço.

5 Respostas

ViniGodoy

Se você quer melhorar a performance, o primeiríssimo passo é descobrir o que está lento.
Para isso, você usa um profiler, como o Netbeans profiler ou o Visual VM:
http://profiler.netbeans.org/
http://visualvm.java.net/

Após efetuar o profiling, poste os resultados que discutiremos como melhorar o gargalo específico.

ViniGodoy

Seu código já está bem enxuto. Se o problema for mesmo I/O, eu chutaria que a melhoria poderia ser feita estudando esse artigo:
http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

Mas isso só o profiler vai dizer.

rock-skull

Olá Vini,

Obrigado pela resposta.

Assim, não é que ele esteja exatamente lento. Está fazendo num tempo razoável. Eu queria mesmo saber era se eu conseguiria melhorar isso, pois esse método é chamado de minutos em minutos, e ganhado algumas centenas de milisegundos que seja, já seria um ganho grande no geral mais pra frente. Mas vou analisar com essas ferramentas que você me indicou e ler o artigo.

Obrigado.

lucasportela

Já que não ocorre nenhum erro dentro do loop, então não é necessário o try-catch, e não precisa de tantos catchs, use um genérico

try {  
        BufferedReader in = new BufferedReader(new FileReader(dataFile));  
        String nextLine = "";          
        countData = 0;  
        int [] points = new int[size];  
        while((nextLine = in.readLine())!=null){   
            points[countData] = (int) (Double.parseDouble(nextLine.trim())*1000.0);  
            countData++;   
        }
    } catch (Exception e) {  
           logger.error("Error reading data. "+dataFile.getName()+" not found");  
           return null;  
    }

Verifica se isso irá melhorar o tempo de execução

L

O tempo de 1,3 segundos é um bom tempo para o processamento de mais de 60 mil valores, não acha?
Quando falamos de melhora de performance, falamos de podemos limpar um pouco o codigo, ou usar algum tipo e atalho para uma determinada ação, deixar de ficar passando coisas para variaveis auxiliares e etc… Mas no seu caso nao tem não disso então, acho que esse tempo é o melhor que voce pode chegar.

Uma ideia jogada no ar, ja tentou executar seu programa com o ‘java 7’, quem sabe veio algum tipo de improvement pra esse tipo de processamento ^^

Boa sorte!

Criado 15 de agosto de 2011
Ultima resposta 18 de ago. de 2011
Respostas 5
Participantes 4