Amigos, tenho a necessidade em meu projeto, em realizar a busca ráida, num arquivo .TXT, de um ID(Ex."999999"), String, contido em uma lista com mil registros (ID, NOME).

Hoje, realizo a leitura por cada linha desse arquivo, tornando muito demorado o processo de identificação de um registro. Sendo assim, gostaria de saber se alguém conhece uma forma rápida de busca. Grato!

Exibições: 730

Responder esta

Respostas a este tópico

Renato, boa tarde!

Como vc está fazendo essa busca atualmente?

Você coloca a lista na memória e depois faz a pesquisa?

O tipo de pesquisa que vc está usando chama-se pesquisa sequencial.

Existe um outro tipo de pesquisa chamada pesquisa binária que é mais rápida, mas precisa de arrays para ser implementada.

Se você detalhar melhor seu problema e postar seu código ou parte dele fica mais fácil para ajudar.

Abro o arquivo, e crio um loop(while) usando o método ArqSD.read(), para ler cada linha e identificar o registro.

A lista fica em um arquivo .TXT, num shield SD.

Para otimizar a pesquisa os dados deverão estar classificados no arquivo. Eles estão ?

Se afirmativo, existem vários algoritmos de pesquisa binária, o mais comum e muito eficiente é bubble sort. Um exemplo:

https://www.vivaolinux.com.br/script/Algoritmo-de-ordenacao-Bubble-...

Este é apenas um exemplo, mas é fácil encontrar outros. tem que ser em C ou C++, para você implementar facilmente no Arduino.

Mais uma coisa - você precisa ter o arquivo inteiro na memória, pois o algoritmo bubble sort começa a pesquisa no meio dos dados. Ou seja, você deverá, por exemplo, armazenar seu arquivo em uma array

Olha mais um exemplo, usando Arduino e um algoritmo bubble sort:

http://www.hackshed.co.uk/arduino-sorting-array-integers-with-a-bub...

 Meu problema atual é resultante da não possibilidade de armazenamento em memória, pois o Arduino já está no seu limite. Mas verei como resolver esse problema de memória.Grato Odilon.

Mais um dúvida Renato:

- Cada linha tem um único ID ou tem outros dados misturados na linha do arquivo?

- Você precisa fazer a pesquisa uma única vez no arquivo ou várias durante a execução do programa?

Precisamos entender melhor para pode ajudar...

José Augusto, tem o ID e NOME (Formato: 9999|AAAAAAA)

Pode pesquisar só pelo ID ? Ficará mais fácil. 

Para mil registros, lendo linha a linha, direto no arquivo .TXT, no SD, fica extremamente lento, este é o meu problema.

Entendi o seu problema.

Ele é difícil de resolver.

A velocidade de acesso de um SD é lenta e, portanto, não é culpa do algoritmo utilizado, seja ele sequencial ou binário.

Você vai precisar jogar os dados para a memória. No entanto são muitos dados e sua aplicação está estourando.

Solução 1)

Jogue os dados para arrays em memória, mas use a memória flash pois não vai ocupar memória RAM

Para isso, use a diretiva PROGMEM. Veja aqui um exemplo:

https://www.arduino.cc/en/Reference/PROGMEM

O problema é que cada vez que alterar a lista, talvez você tenha que resetar a aplicação. Precisa testar. Não tenho certeza.

Solução 2) Instale memória adicional, ligando outro processador como o Attiny e acessando via SPI. Existem também expansões de memória RAM, O Murta citou aqui em algum post.

Solução 3) Troque por um Arduino de maior capacidade, como o Mega

Solução 4) Guarde os dados em um banco de dados e acesse pela rede

Com certeza outro amigo garagista deve ter outra solução, mas acessar diretamente o SD vai ser sempre lento

Sim, estou buscando informações para a transferencia dos registros da SD para a FLASH, usando a PROGMEM, obrigado pelas boas dicas José Augusto!

Essa lista será atualizada remotamente, pois será usada para operações de leitura OFFLINE, caso não tenha a internet, ou com a busca direta ao banco de dados ONLINE.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço