Leitura de TXT muito grande

Ola galera…

Estou fazendo um sistema de busca de palavras em um arquivo gigante de texto, algo em torno de 40mg de texto puro… o problema eh q a leitura eh mtttt lenta… jah passei o texto para um banco de dados, mas a leitura ainda eh lenta demais… (uso o apache derby)… se o carregamento for direto pelo arquivo entao, demora muito mais…

O estranho eh q tenho um exemplo de um programa parecido com o que tenho que implementar, com banco de dados NFO, e a leitura neste eh instantanea, sem senhum lag…

Precisaria mostrar tal texto na tela e fazer a busca de palavras neste, “marcando” a palavra achada no texto… uso .txt puro e jogo num JTextArea, busco a palavra e marco ela… isto jah está pronto… o problema está no carregamento inicial do texto…

Alguem teria alguma saida para a lentidao???

Abraços
Joao Paulo Sossoloti
jopss@hotmail.com

Acho que você está usando String em vez de StringBuffer. e não deve estar usando BufferedReader. Vou carregar um arquivo de 40 MB de duas maneiras (a errada e a certa) e vou lhe mostrar os resultados daqui a pouco.

import java.io.*;
import java.util.*;

class TesteCarregamentoTxt {
    private static Random rand = new Random();
    private static char[] LETRAS = " abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ; , . -  0123456789".toCharArray();
    private static String LINE_SEPARATOR = System.getProperty ("line.separator");
    /**
    * Gera uma linha de 10 a 80 caracteres.
    */
    public static String geraLinha () {
        StringBuffer sb = new StringBuffer();
        for (int r = rand.nextInt (71) + 10; r &gt= 0; --r) {
            sb.append (LETRAS[rand.nextInt(LETRAS.length)]);
        }
        return sb.toString();
    }
    /**
    * Gera um arquivo texto com aproximadamente 40 MB.
    * Para parecer mais real, ele terá linhas entre 10 e 80 caracteres, tais como um arquivo de programa.
    */
    public static void generateTestFile (String filename) throws IOException {
        System.out.println ("Gerando o arquivo de teste...");
        PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter (filename)));
        long remaining = 40 * 1024 * 1024;
        while (remaining &gt 0) {
            String linha = geraLinha();
            pw.println (linha);
            remaining -= linha.length() + LINE_SEPARATOR.length();
        }
        pw.close();
    }
    public static void timeThis (String title, Runnable code) {
        System.out.println ();
        System.out.println (title);
        long time = System.currentTimeMillis();
        code.run();
        time = System.currentTimeMillis() - time;
        System.out.println ("Tempo Transcorrido: " + time + " ms");
    }
     public static void main(String[] args) throws IOException {
        generateTestFile ("teste.txt");
        timeThis ("Método correto - StringBuffer + BufferedReader + readLine", new Runnable() {
            public void run() {
                try {
                    BufferedReader br = new BufferedReader (new FileReader ("teste.txt"));
                    StringBuffer ret = new StringBuffer();
                    String linha;
                    while ((linha = br.readLine()) != null) {
                        ret.append (linha).append (LINE_SEPARATOR);
                    }
                    br.close();
                    System.out.println ("Lida a string com " + ret.toString().length() + " bytes");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
        timeThis ("Método errado - String + read 1 caracter", new Runnable() {
            public void run() {
                try {
                    FileReader fr = new FileReader ("teste.txt");
                    String ret = "";
                    int ch;
                    while ((ch = fr.read()) != -1) {
                        ret += (char) ch;
                    }
                    fr.close();
                    System.out.println ("Lida a string com " + ret.length() + " bytes");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }
}

Experimente rodar o programa acima; o método "certo" de carregar o arquivo leva 3 segundos; desisti de esperar quanto tempo para o método "errado". Como ele carrega o arquivo inteiro para a memória, é necessário passar um parâmetro para o programa Java - exemplo: -Xmx384m para reservar 384 MB de memória para o Java.

1 curtida

Thingol você tem algum artigo sobre File como criar File em java
file .txt abraço !!!

[quote=Raff]Thingol você tem algum artigo sobre File como criar File em java
file .txt abraço !!![/quote]

Middle…

Cara, é só você fazer:

File novoArquivo = new File("NomeDoNovoArquivo.txt");
novoArquivo.createNewFile(); // esse método criar fisicamente o novo arquivo

Poxa, vlw mesmo thingol… um teste simples que nao tinha me passado… :shock:

Na verdade nao resolveu a situacao, mas se chegou ao exato problema. O problema não está então no carregamento do texto, mas sim NO CARREGAMENTO PELO JTEXTAREA !!

O teste deu sim 3 segundos para o carregamento do arquivo, mas em torno de 40 segundos para carregar o buffer no jTextArea…

 jTextArea.setText(buffer.toString) 

Pode me ajudar nisso??? Seria alguma propriedade do componente??? Teria algum especifico para textos grandes???

vlw galera.
jopss [:p]

[quote=jopss]Poxa, vlw mesmo thingol… um teste simples que nao tinha me passado… :shock:

Na verdade nao resolveu a situacao, mas se chegou ao exato problema. O problema não está então no carregamento do texto, mas sim NO CARREGAMENTO PELO JTEXTAREA !!

O teste deu sim 3 segundos para o carregamento do arquivo, mas em torno de 40 segundos para carregar o buffer no jTextArea…

 jTextArea.setText(buffer.toString) 

Pode me ajudar nisso??? Seria alguma propriedade do componente??? Teria algum especifico para textos grandes???

vlw galera.
jopss [:p][/quote]

Já tentou usar SwingWorker, criando uma thread separada pra carregar o texto no seu JTextArea?
Aliás, vc não precisa nem carregar tudo de uma vez, pode carregar conforme a necessidade… Afinal, vc não consegue mostrar isso tudo de uma vez só :slight_smile:

Mas,
como ficaria se eu quisesse achar uma palavra no meio de tudo isso?

Tem uns algoritmos bons como Boyer-Moore

=p

Orra irado eim,
ainda nao consegui testar mas pretendo ate o fim do dia…

valeu bro !!
fica com deus!

Alguem teria algo sobre esse Boyer-Moore em portugues??? Funciona como??

jopss :stuck_out_tongue:

[quote=jopss]Ola galera…

Estou fazendo um sistema de busca de palavras em um arquivo gigante de texto, algo em torno de 40mg de texto puro… o problema eh q a leitura eh mtttt lenta… jah passei o texto para um banco de dados, mas a leitura ainda eh lenta demais… (uso o apache derby)… se o carregamento for direto pelo arquivo entao, demora muito mais…

O estranho eh q tenho um exemplo de um programa parecido com o que tenho que implementar, com banco de dados NFO, e a leitura neste eh instantanea, sem senhum lag…

Precisaria mostrar tal texto na tela e fazer a busca de palavras neste, “marcando” a palavra achada no texto… uso .txt puro e jogo num JTextArea, busco a palavra e marco ela… isto jah está pronto… o problema está no carregamento inicial do texto…

Alguem teria alguma saida para a lentidao???

Abraços
Joao Paulo Sossoloti
jopss@hotmail.com[/quote]

O João blz , desculpa encomodar ai , vi que vc tbm usa o derby como banco de dados poderia me dar uma força

estou precisando carregar o banco com um arquivo texto se vc puder me ajudar ficarei grato

Abri um topico no Guj

se vc puder fazer uma visita …

valeu

http://www.guj.com.br/posts/list/214297.java

Att Javax

[quote=jopss]Poxa, vlw mesmo thingol… um teste simples que nao tinha me passado… :shock:

Na verdade nao resolveu a situacao, mas se chegou ao exato problema. O problema não está então no carregamento do texto, mas sim NO CARREGAMENTO PELO JTEXTAREA !!

O teste deu sim 3 segundos para o carregamento do arquivo, mas em torno de 40 segundos para carregar o buffer no jTextArea…

 jTextArea.setText(buffer.toString) 

Pode me ajudar nisso??? Seria alguma propriedade do componente??? Teria algum especifico para textos grandes???

vlw galera.
jopss [:p][/quote]

Não sei se vai te ajudar mas tá ai minha contribuição , espero que Seja util

    botao1.addActionListener(new ActionListener(){                          
        public void actionPerformed(ActionEvent Clik){                                                     
              ProgressBar.setValue(0);
              //JFileChooser fileChooser = new JFileChooser("."); 
              JFileChooser fileChooser = new JFileChooser("Y://Producao//feitos"); // Força a Abrir em uma Pasta Determinada
              fileChooser.showOpenDialog(tela);
              File arquivo_Entrada = fileChooser.getSelectedFile();

            if (arquivo_Entrada != null){

                        textArea1.setText("");
                        String s = LeitorBuffer.ler(arquivo_Entrada);
                        textArea1.append(s);

                        s = null;
                        arquivo_Entrada = null;
                        fileChooser = null;
                        textArea1.setCaretPosition(0);
                        int quant = textArea1.getLineCount();
                        maxValue = quant;
                        ProgressBar.setMaximum(maxValue - 2);
                       // System.out.println("Bytes e memoria livres  Antes de passar ganbage collection o System.gc() = " + Runtime.getRuntime().freeMemory());

                       System.gc();

                        for (int j = 0; j < quant; j++) {
                            final int percent = j;
                            // Função Para Barra de Processamento Começo
                            ProgressBar.setValue(percent);
                            // Função Para Barra de Processamento Final
                        }
            }
        }
    });
         
    botao2.addActionListener(new ActionListener(){                          
        public void actionPerformed(ActionEvent Clik){                                                     
           ProgressBar.setValue(0);
           if (!textArea1.getText().equals("")){  
              textArea1.setCaretPosition(0); // Mantem o Cursor no inicio
              Chave_Segundaria = "+$DJDE$";            
              Chave_Primaria = JOptionPane.showInputDialog(null, " Digite Ou Use o Leitor Optico Para Pesquisa ", "Box de Pesquisa", JOptionPane.INFORMATION_MESSAGE);
           }else{
                JOptionPane.showMessageDialog(null, "            Não Foi Selecionado Nenhum Arquivo "+"\n"+"Por Favor Click em Abrir Para Selecionar o Arquivo "+"\n"+"                             a Ser Pesquisado", "                   Mensagem de Erro Verificar", JOptionPane.ERROR_MESSAGE) ;
                }
   
           if (Chave_Primaria != null){
               if (!Chave_Primaria.equals("")){   
                       int Codigo_de_Pesquisa = textArea1.getText().indexOf(Chave_Primaria.trim().toUpperCase(), posInicial);
                       if(Codigo_de_Pesquisa < 0){
                          JOptionPane.showMessageDialog(null, "    Codigo Não Encontrado   ");
                          posInicial = 0;   
                       }else{
                                                    
                          Cont_Reg++; 
                          
                          if(Cont_Reg > 1){
                                Monta_Cabecalho = false;
                            }   

                          //  System.out.println("Resultado da Variavel Boolean = "+Monta_Cabecalho);   //Converter Inteiro Para String

                            textArea1.requestFocus();
                            textArea1.select(Codigo_de_Pesquisa, Codigo_de_Pesquisa + Chave_Primaria.length());
                            posInicial = Codigo_de_Pesquisa + Chave_Primaria.length();
                            
                          int quant = textArea1.getLineCount();
                          maxValue=quant;
                          ProgressBar.setMaximum(maxValue-2);
                          
                          for(int i = 0; i < quant; i++){
                            try{
                                  int inicio = textArea1.getLineStartOffset(i);
                                  int fim = textArea1.getLineEndOffset(i);
                                  final int percent = i;
                             
                            // Função Para Barra de Processamento Começo
                                  ProgressBar.setValue(percent);
                            // Função Para Barra de Processamento Final
                            
                                  String linha = textArea1.getText(inicio, fim - inicio);
                                 // JOptionPane.showMessageDialog(null, "LINHA = " + (i + 1) + " = " + linha);
                                     if(linha.indexOf(Chave_Segundaria.trim().toUpperCase()) == 0 && posInicial != 0){   
                                         //System.out.println("Achou uuuu ");                              
                                         Cont_Lin = 0;
                                         Cont_DJDE++;
                                         
                                        if(Cont_DJDE == 1){
                                          Form1 = linha.trim().substring(0);    
                                          Form1 = Form1.replaceAll("_A3" , "_A4");
                                        }else if(Cont_DJDE == 2){
                                          Form2 = linha.trim().substring(0);
                                          Form2 = Form2.replaceAll("_A3" , "_A4");
                                        }                               
                                     }
                                 
                                 if (linha.indexOf(Chave_Primaria.trim().toUpperCase()) >0){
                                      
                                   Cont_Lin++;
                                                                                                                                            
                                    if(Cont_Lin == 1){ 
                                       Forms++;
                                    }else if(Forms >= 2){
                                        Forms = 0;
                                    }   
                                  
                                     if(Forms == 1 && Cont_Lin == 1){
                                        Form = Form1;
                                        Insere_DJDE = true; 
                                        Flag = 1;                                     
                                     }else if(Forms == 2 && Cont_Lin == 1){
                                        Form = Form2;
                                        Insere_DJDE = true;
                                        Flag = 2;
                                     }else { 
                                        Insere_DJDE = false;
                                        Line = 0;
                                        Total_Line = Cont_Lin-1;
                                     }    
                                    // System.out.println("cont_linha "+Cont_Lin);
                                    // System.out.println("Vedadeiro ou falso "+Insere_DJDE);                                  
                                    // System.out.println("Formulario "+Form);
                                 }

                                  
                                  // ***** Abaixo a Função Já Esta Funcionando Para Remissao Em A4 Começo
                                   if (linha.indexOf(Chave_Primaria.trim().toUpperCase()) > 0 || i < 4 && Monta_Cabecalho == true ){ 
                                            
                                      //  JOptionPane.showMessageDialog(null, " Cont_Lin = " + Cont_Lin +" Total_Line = " + Total_Line+" Formulario = " + Forms+" Flag = " + Flag);

                                   //  if(Total_Line > Cont_Lin){
                                   //   do {
                                   //     System.out.println("******************* Fazendo **********************");
                                   //     Line++;
                                   //     textArea2.setText(textArea2.getText()+"KKK = "+Line+"\r\n");
                                    //   }while (  Line <= Total_Line  );
                                    //  }
                                       
                                       if(Insere_DJDE == true){
                                        textArea2.setText(textArea2.getText()+Form+"\r\n");
                                        //System.out.println("Total_Line "+Total_Line);
                                       }

                                       textArea2.setText(textArea2.getText()+linha.trim().substring(0)+"\r\n");    
                                      // System.out.println(textArea2.getText()+" Flag "+Flag );
                                   }
                                 // ***** Acima a Função Já Esta Funcionando Para Remissao Em A4 Final
                            
                            }catch(BadLocationException ex){
                                 // possiveis erros são tratados aqui
                            } 
                          }    
                       }
               }else{
                  JOptionPane.showMessageDialog(null, "Não Foi Inserido o Codigo Para Pesquisa", "Mensagem de Erro Verificar", JOptionPane.ERROR_MESSAGE);
                    }   
          }   
        
        }         
    });
         
    botao3.addActionListener(new ActionListener(){                           
        public void actionPerformed(ActionEvent Clik){  
             ProgressBar.setValue(0);
             if (!textArea2.getText().equals("")){
                         //JFileChooser fc = new JFileChooser();                       
                         JFileChooser fc = new JFileChooser("R://REMISSÕES"); // Força a Abrir em uma Pasta Determinada
                 if(fc.showSaveDialog(Remissao.this) != JFileChooser.APPROVE_OPTION){
                        return;
                 }   
                       File arquivo_Saida = fc.getSelectedFile(); 
                    if(arquivo_Saida == null){
                         return;
                    }   
                       FileWriter writer = null;   
                      try{
 
                          writer = new FileWriter(arquivo_Saida);
                          writer.write(textArea2.getText());
                             int quant = textArea2.getLineCount();
                             maxValue=quant;
                             ProgressBar.setMaximum(maxValue-2);
                             for(int j = 0; j < quant; j++){
                               final int percent = j;
                               // Função Para Barra de Processamento Começo
                                ProgressBar.setValue(percent);
                               // Função Para Barra de Processamento Final
                             }
                         }catch(IOException ex){
                    //   Possiveis erros aqui
                         } 
                      finally{
                             if(writer != null){
                                 try{
                                  writer.close();
                                 }catch (IOException x){
                                // Codigo de erro a ser Inserido   
                                 }
                               }
                             }
               }else{            
                  JOptionPane.showMessageDialog(null, "Não Foi Selecionado Nenhum Registro", "Mensagem de Erro Verificar", JOptionPane.ERROR_MESSAGE);
                    }   
        }                                            
    }); 

Boa Tarde JavaX_JavaX

quando eu vi o codigo e vi a linha === $DJDE$ eu me perguntei.

voce esta usando este programa na formatação de formulario EOS Mainframe Xerox para plataforma Baixa ?

ou esta usando no que e o que ele faz com o formulario ?

[quote=labavel]
Boa Tarde JavaX_JavaX

quando eu vi o codigo e vi a linha === $DJDE$ eu me perguntei.

voce esta usando este programa na formatação de formulario EOS Mainframe Xerox para plataforma Baixa ?

ou esta usando no que e o que ele faz com o formulario ?[/quote]

Bom dia!

Labavel, na verdade este programa trata um arquivo em Spool de impressão , que usa Um controle de carro MetaCoud $DJDE , Padrão Xerox

Porem esse projeto é apenas para apartir de uma chave_primaria buscar um sequencia de linha , eu capturo a linda do Pdl , ou formulario Xerox , apesar de não usar mais
essa linguagem Fdl e Pdl Padrão Xerox , esse tipo de tratamento usado pela Xerox possibilita um bom tratamente para manipulação do arquivo.

estou no momento trabalhado com as possibilidades , de novos projetos , mas devido ao pouco conhecimento em java e falta de tempo, estão parados

Att JavaX

Eu tambem trabalhando em um projeto semelhante em HFDL que e o spool de impressão no codigo postado por voce se eu emtendi voce esta acessando a pasta principal que acessa os Spools e a partir dela acha os Forms do Arquivo e isto ?

Depois de achar o forms voce faz uma reimissão do documento a questão e neste programa voce retoma o arquivo inteiro ou um pedaço dele mais o Banner padrão.

e se possivel passar o restante do codigo para estudos e aperfeiçõamentos.

em minha aplicação transformo em PDF e gero sempre pag 1 retomada mais final.