Ao reler esta minha posta de ontem, lembrei-me das embedded resources, que costumam ser usadas para a localização de aplicações, mas que nada impede que sejam usadas para transportar o que quer que seja. Embeber um ficheiro de texto seria trivial, e as vantagens seriam potencialmente animadoras – ao arrancar a aplicação, a framework carrega muito mais depressa as resources junto com o executável do que o StreamReader consegue ler um ficheiro externo.
Embeber um ficheiro no Visual Studio é do mais simples que há: no menu de contexto do projecto, escolher a opção Properties, depois a aba Resources. Se não existirem resources, clicar no link que estará bem visível no meio da página, e escolher Add New Text File do dropdown Add Resource.
Para se aceder à resource é ainda mais simples:
string linhas = TrieTest.Properties.Resources.palavras;
TrieTest é o nome do meu namespace; palavras é o nome da minha resource (ao inserir o ficheiro de texto como resource, o Visual Studio “adivinha” o nome da mesma a partir do nome do ficheiro, mas pode ser modificado). O resto é bastante simples e intuitivo. Tenham apenas em conta que, neste caso, estamos a carregar directamente para string porque é um ficheiro de texto; imagens, sons, teriam de ser carregados para o tipo correspondente.
O código usando esta nova metodologia fica então assim:
// como este é o nodo principal da árvore
// não tem uma inicialização explícita.
Trie myTrie = new Trie();
// as struct tem um comportamento nem sempre muito intuitívo
// ao fazer inicializações sem parâmetros
// por via das dúvidas, vamos inicializar as variáveis aqui
myTrie.filhas = new Dictionary<char, Trie>();
myTrie.final = false;
// ler a resource
string[] linhas = TrieTest.Properties.Resources.palavras.Split(‘\n’);
for(int i = 0; i < linhas.Length; i++)
myTrie.Inserir(linhas[i].ToLower());
Poupam-se duas linhas, a abertura e fecho da stream do ficheiro. E, muito mais importante, o tempo de criação da trie é reduzido quase a metade: onde ontem demorava à volta dos 8 segundos, chegando aos 9 e até 10 nalguns testes (lá teria os cores ocupados com outra treta qualquer), hoje passou para 4,5 segundos, nunca chegando aos 5 segundos. Isto é basicamente o tempo de se olhar para um splashscreen enquanto carrega em background…
Trie - Uma estrutura de alta performance de pesquisa
Trie contra-ataca – uso de wildcards em pesquisas, correcções e limpeza