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!
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por