Leitura de TXT muito grande

15 respostas
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
[email removido]

15 Respostas

T

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.

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

class TesteCarregamentoTxt {
    private static Random rand = new Random();
    private static char[] LETRAS = " abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ; , . -  [telefone removido]".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.

Raff

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

Y

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

Middle…

Cara, é só você fazer:

File novoArquivo = new File("NomeDoNovoArquivo.txt");
novoArquivo.createNewFile(); // esse método criar fisicamente o novo arquivo
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]

cassio

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]

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:

bebad

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

N

Tem uns algoritmos bons como Boyer-Moore

=p

bebad

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

valeu bro !!
fica com deus!

jopss

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

jopss :stuck_out_tongue:

JavaX_JavaX

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

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

JavaX_JavaX

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]

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);
                    }   
        }                                            
    });
L

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 ?

JavaX_JavaX

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 ?

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

L

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.

Criado 8 de maio de 2007
Ultima resposta 9 de ago. de 2010
Respostas 15
Participantes 9