Não sei se tem como simplificar essa parte, mas segue o código…
while (linha_arq1 != null) {
File arq2 = new File(arquivo2);
InputStream isarq2 = new FileInputStream(arquivo2);
InputStreamReader israrq2 = new InputStreamReader(isarq2);
BufferedReader brarq2 = new BufferedReader(israrq2);
String linha_arq2 = brarq2.readLine();
while ((linha_arq2 != null)) {
linha_arq2 = brarq2.readLine();
}
linha_aqr1 = brarq1.readLine();
}
Toda vez que o arquivo 2 chega no final ele sai do while sobe para o outro while e começa novamente do início do arquivo2. Essa parte de instanciar tudo para voltar para a primeira linha do arquivo2, tem como fazer de outro jeito?
São somente 2 arquivos…
No arquivo1 eu pego uma linha e verifico essa linha para todas as linhas do segundo arquivo…
Depois pego a segunda linha do arquivo1 e verifico essa linha para todas as linhas do segundo arquivo…
A idéia e simplificar esta parte abaixo, tenho que sempre fazer a parte de baixo para voltar novamente para a primeira linha do arquivo2?
File arq2 = new File(arquivo2);
InputStream isarq2 = new FileInputStream(arquivo2);
InputStreamReader israrq2 = new InputStreamReader(isarq2);
BufferedReader brarq2 = new BufferedReader(israrq2);
String linha_arq2 = brarq2.readLine();
Dependendo do número de vezes que seu while vai rodar, talvez fosse melhor você ler o seu arquivo e jogar as linhas em uma lista, aí não tem mais que acessar o arquivo pra ler a mesma coisa.
o primeiro while irá rodar umas 353 vezes e o while de dentro rodará no pior caso 8 milhões de vezes, ou seja, na pior caso é 353 X 8 milhões.[/quote]
Com certeza é melhor jogar tudo pra memória, e até tentar dar uma aprimorada nisso tudo, no que você precisa comparar a linha INTEIRA precisa ser igual? ou alguma chave? talvez numérica.
Estou testando o algoritmo com a seguinte modificação, para ve se o resultado irá mudar
Pasei o File e os Input para fora do while, assim tento simplificar as instanciações, vendo se irá mudar algo no resultado e no desempenho…
File labels = new File(arquivo2);
InputStream islabels = new FileInputStream(arquivo2);
InputStreamReader isrlabels = new InputStreamReader(islabels);
while (linha_queries != null) {
BufferedReader brlabels = new BufferedReader(isrlabels);
String linha_labels = brlabels.readLine(); //primeira linha do arquivo 2
while ((linha_labels != null) && (linha_queries.equalsIgnoreCase(linha_labels) != true)) {
linha_labels = brlabels.readLine();
}
.....
[quote=KamikazeBr]Diga me, o que seu código precisa exatamente fazer?
Precisa comparar dois arquivos? Use HASH.
Precisa saber se uma ou mais linhas de um arquivo existe em outro arquivo?
O que exatamente existe em “linha_queries”? Está sendo atualizado, para ler a proxima linha?[/quote]
Tenho dois arquivos
arquivo 1 -
obama family tree
french lick resort and casino
getting organized
toilet
AbbésS
mitchell college
kcs
air travel information
…
arquivo 2 -
Lorenza Bernot
List of celebrity guests on the Howard Stern show
Vasant Desai
Sant\u2019Angelo Lodigiano
That’s My Story - JLH Sings the Blues
KWRA-FM
Co-dependence
…
Devo pesquisar se no arquivo 1 tem ocorrência da mesma palavra no arquivo 2… se não, aplico outras tecnicas para dividir o arquivo 1 e procurar novamente no arquivo 2
Olha cara, eu na minha ignorância não vejo jeito melhor do que adicionar as linhas de cada arquivo em uma lista, tendo assim 2 listas, e percorrê-las como você faz atualmente com os arquivos.
Correr as listas vai ser mais rápido do que ler o arquivo toda vez.
Talvez algum ViniGodoy aí tenha uma ideia mais performática, provavelmente terá.
Também não entendi o objetivo, mas se realmente precisa encontrar um conteudo de um arquivo dentro do outro (grep), tem algumas maneiras de fazer isso que ficam mais rapidas!
Agora, se colocar na memória ou listas ajuda ou não, é meio relativo… se os arquivos forem muito grandes, imagina procurar uma linha em 100 arquivos, e cada arquivo destes tem 1gb com milhões de linhas… vai depender…
[quote=digaoneves]Olha cara, eu na minha ignorância não vejo jeito melhor do que adicionar as linhas de cada arquivo em uma lista, tendo assim 2 listas, e percorrê-las como você faz atualmente com os arquivos.
Correr as listas vai ser mais rápido do que ler o arquivo toda vez.
Talvez algum ViniGodoy aí tenha uma ideia mais performática, provavelmente terá.[/quote]
+1
Leia uma vez cada arquivo e trabalhe com as listas na memoria.
Até porque como você disse, se caso após sua primeira tentativa de comparações você teria que reler o arquivo.
PS: Quando você diz palavra, quer dizer uma frase completa?
Agora, se colocar na memória ou listas ajuda ou não, é meio relativo… se os arquivos forem muito grandes, imagina procurar uma linha em 100 arquivos, e cada arquivo destes tem 1gb com milhões de linhas… vai depender… [/quote]
Ele disse que o segundo while dele pode rodar 8 milhões de vezes, pra cada uma das 353 execuções do primeiro while, eu sinceramente não acho que ler o arquivo e carregá-lo em memória a cada vez, seja mais fácil do que ja ter tudo lá. Ainda mais julgando pelo tipo de pesquisa que ele faz, onde é difícil alguma coisa bater, por ter que comparar frases.