Performance para batimento de dados

0 respostas
F

Pessoal, tenho um problema, com limitações técnicas.

Preciso realizar um batimento, de aproximadamente 24 arquivos texto (2 lotes de 12 arquivos), cada um contendo mais de 50m linhas. Não tenho como realizar a leitura em parte, pois não sei em qual dos arquivos a informação se repete, e tenho muitas variáveis de batimento.

Tentei uma abordagem de performance, subindo tudo em memoria em dois hashmap diferente, e faço meus batimentos usando esses hash. ± assim:

private void ProcessaCarga(String v_file,HashMap <String,String> v_hash,String v_dir){

		String v_linha = "";

		//Processamento dos arquivos de entrada
		File file = new File(v_file); 
		File afile[] = file.listFiles(); 
		int i = 0;
		String v_key="";
		int totalDup=0;
		int totalArq=0;

		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(Constants.v_resultado+"duplicados_"+v_dir+".csv"));

			for (int j = afile.length; i < j; i++) { 

				File arquivos = afile[i]; 

				if(arquivos.getName().toLowerCase().contains(".csv")){

					System.out.println("Lendo arquivo: "+ arquivos.getName());
					totalArq++;

					try {
						
						BufferedReader br = new BufferedReader(new FileReader(arquivos),8 * 1024);
						
						while ((v_linha = br.readLine()) != null) {

							if(!v_linha.contains("TIPO_DE_CONVERSAO")){

								//System.out.println(v_linha);
								String s[] = v_linha.split(";");
								v_key=s[0]+";"+s[1]+";"+s[2]+";"+s[3]+";"+s[4]+";"+s[5]+";"+s[6];

								if(!v_hash.containsKey(v_key)){
									v_hash.put(v_key, s[7]);
								}
								else{
									out.write(v_key+"\n");
									totalDup++;
								}
							}

						}
						br.close();
					} catch (FileNotFoundException e) {
						System.out.println("Erro ao abrir o arquivo: " + arquivos.getName()+"\n"+e.getMessage());
					} 
					catch (Exception e) {
						System.out.println("Erro ao ler o arquivo: " + arquivos.getName()+"\n"+e.getMessage());
					}
				}
			}

			out.close();

		} catch (IOException e) {
			System.out.println("Erro ao criar arquivo de duplicados: "+"duplicados_"+v_dir+".csv \n"+e.getMessage());
		}
		catch (Exception e) {
			System.out.println("Erro no arquivo de duplicados: "+"duplicados_"+v_dir+".csv \n"+e.getMessage());
		}
		
		System.out.println("Total de arquivos lidos <"+totalArq+">");
		System.out.println("Total de linhas duplicadas <"+totalDup+">");
		//Fim do processamento dos arquivos de entrada
	}

Esse batimento seria realizado em um micro de usuário, ou seja, com no máximo 3gb de ram, sem banco de dados.

O problema q estou enfrentando, performance, e constantes erros de gc full.

Alguém teria alguma ideia de outra abordagem?

Criado 31 de maio de 2013
Respostas 0
Participantes 1