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…
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
thingol1 like
importjava.io.*;importjava.util.*;classTesteCarregamentoTxt{privatestaticRandomrand=newRandom();privatestaticchar[]LETRAS=" abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ; , . - [telefone removido]".toCharArray();privatestaticStringLINE_SEPARATOR=System.getProperty("line.separator");/** * Gera uma linha de 10 a 80 caracteres. */publicstaticStringgeraLinha(){StringBuffersb=newStringBuffer();for(intr=rand.nextInt(71)+10;r>=0;--r){sb.append(LETRAS[rand.nextInt(LETRAS.length)]);}returnsb.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. */publicstaticvoidgenerateTestFile(Stringfilename)throwsIOException{System.out.println("Gerando o arquivo de teste...");PrintWriterpw=newPrintWriter(newBufferedWriter(newFileWriter(filename)));longremaining=40*1024*1024;while(remaining>0){Stringlinha=geraLinha();pw.println(linha);remaining-=linha.length()+LINE_SEPARATOR.length();}pw.close();}publicstaticvoidtimeThis(Stringtitle,Runnablecode){System.out.println();System.out.println(title);longtime=System.currentTimeMillis();code.run();time=System.currentTimeMillis()-time;System.out.println("Tempo Transcorrido: "+time+" ms");}publicstaticvoidmain(String[]args)throwsIOException{generateTestFile("teste.txt");timeThis("Método correto - StringBuffer + BufferedReader + readLine",newRunnable(){publicvoidrun(){try{BufferedReaderbr=newBufferedReader(newFileReader("teste.txt"));StringBufferret=newStringBuffer();Stringlinha;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(IOExceptionex){ex.printStackTrace();}}});timeThis("Método errado - String + read 1 caracter",newRunnable(){publicvoidrun(){try{FileReaderfr=newFileReader("teste.txt");Stringret="";intch;while((ch=fr.read())!=-1){ret+=(char)ch;}fr.close();System.out.println("Lida a string com "+ret.length()+" bytes");}catch(IOExceptionex){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.
R
Raff
Thingol você tem algum artigo sobre File como criar File em java
file .txt abraço !!!
Y
Yky_Mattshawn
Raff:
Thingol você tem algum artigo sobre File como criar File em java
file .txt abraço !!!
Middle…
Cara, é só você fazer:
FilenovoArquivo=newFile("NomeDoNovoArquivo.txt");novoArquivo.createNewFile();// esse método criar fisicamente o novo arquivo
J
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]
C
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ó
B
bebad
Mas,
como ficaria se eu quisesse achar uma palavra no meio de tudo isso?
N
nikcopernico
Tem uns algoritmos bons como Boyer-Moore
=p
B
bebad
Orra irado eim,
ainda nao consegui testar mas pretendo ate o fim do dia…
valeu bro !!
fica com deus!
J
jopss
Alguem teria algo sobre esse Boyer-Moore em portugues??? Funciona como??
jopss
J
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…
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(newActionListener(){publicvoidactionPerformed(ActionEventClik){ProgressBar.setValue(0);//JFileChooser fileChooser = new JFileChooser("."); JFileChooserfileChooser=newJFileChooser("Y://Producao//feitos");// Força a Abrir em uma Pasta DeterminadafileChooser.showOpenDialog(tela);Filearquivo_Entrada=fileChooser.getSelectedFile();if(arquivo_Entrada!=null){textArea1.setText("");Strings=LeitorBuffer.ler(arquivo_Entrada);textArea1.append(s);s=null;arquivo_Entrada=null;fileChooser=null;textArea1.setCaretPosition(0);intquant=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(intj=0;j<quant;j++){finalintpercent=j;// Função Para Barra de Processamento ComeçoProgressBar.setValue(percent);// Função Para Barra de Processamento Final}}}});botao2.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventClik){ProgressBar.setValue(0);if(!textArea1.getText().equals("")){textArea1.setCaretPosition(0);// Mantem o Cursor no inicioChave_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("")){intCodigo_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 StringtextArea1.requestFocus();textArea1.select(Codigo_de_Pesquisa,Codigo_de_Pesquisa+Chave_Primaria.length());posInicial=Codigo_de_Pesquisa+Chave_Primaria.length();intquant=textArea1.getLineCount();maxValue=quant;ProgressBar.setMaximum(maxValue-2);for(inti=0;i<quant;i++){try{intinicio=textArea1.getLineStartOffset(i);intfim=textArea1.getLineEndOffset(i);finalintpercent=i;// Função Para Barra de Processamento ComeçoProgressBar.setValue(percent);// Função Para Barra de Processamento FinalStringlinha=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");}elseif(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++;}elseif(Forms>=2){Forms=0;}if(Forms==1&&Cont_Lin==1){Form=Form1;Insere_DJDE=true;Flag=1;}elseif(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çoif(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(BadLocationExceptionex){// 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(newActionListener(){publicvoidactionPerformed(ActionEventClik){ProgressBar.setValue(0);if(!textArea2.getText().equals("")){//JFileChooser fc = new JFileChooser(); JFileChooserfc=newJFileChooser("R://REMISSÕES");// Força a Abrir em uma Pasta Determinadaif(fc.showSaveDialog(Remissao.this)!=JFileChooser.APPROVE_OPTION){return;}Filearquivo_Saida=fc.getSelectedFile();if(arquivo_Saida==null){return;}FileWriterwriter=null;try{writer=newFileWriter(arquivo_Saida);writer.write(textArea2.getText());intquant=textArea2.getLineCount();maxValue=quant;ProgressBar.setMaximum(maxValue-2);for(intj=0;j<quant;j++){finalintpercent=j;// Função Para Barra de Processamento ComeçoProgressBar.setValue(percent);// Função Para Barra de Processamento Final}}catch(IOExceptionex){// Possiveis erros aqui}finally{if(writer!=null){try{writer.close();}catch(IOExceptionx){// Codigo de erro a ser Inserido }}}}else{JOptionPane.showMessageDialog(null,"Não Foi Selecionado Nenhum Registro","Mensagem de Erro Verificar",JOptionPane.ERROR_MESSAGE);}}});
L
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 ?
J
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
labavel
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.