O que é melhor maneira de implementar matrizes de comprimento variável?
-
08-07-2019 - |
Pergunta
Eu quero armazenar um grande conjunto de resultados do banco de dados na memória. Cada registro tem tempo comprimento e acesso variável deve ser tão rápido como matrizes. Qual é a melhor maneira de implementar isso? Eu estava pensando em manter deslocamentos em uma tabela separada e armazenar todos os registros consecutivamente? É estranho? (Programming language: Delphi)
Solução
Não sei se totalmente segui-lo, mas ter um olhar para TList.
Em Delphi 7, pelo menos, ele é implementado como um arrary de ponteiros. Você pode usar a propriedade capacidade de pré alocar a lista antes do tempo se você sabe quantos resultados estão voltando.
A lista vai crescer automaticamente se ele ficar sem espaço. Quanto cresce depende de quão grande a lista é.
Dê uma olhada na fonte para a unidade de classes para ver o que está fazendo.
Edit:. Também em D2009 apoio genric foi adicionado em TList o que o torna um pouco mais agradável de usar
Outras dicas
A melhor maneira é provavelmente para conter uma matriz de ponteiros para registros. Você não terá que lidar com deslocamentos, nesse caso, e pesquisas será constante de tempo.
Por que não usar uma versão de memória do seu banco de dados? A maioria tem uma maneira de manter uma tabela completa na memória, geralmente envolvendo a palavra-chave SQL MEMORY. Você iria copiar a tabela do disco para a tabela de memória e, em seguida, pode usar todas as operações de banco de dados normais a velocidade da memória. Eu sei que isso funciona bem em DBISAM.
A seguir mj2008 , você poderia usar um TClientDataset em vez de uma matriz de registro. Quão grande é que conjunto de resultados?
Eu usaria TList, e armazenar ponteiros para seu registro.
type
pMyRecord : ^TMyRecord;
...
...
...
var
p : pMyRecord;
...
...
New(p);
with p^ do
begin
...
...
end;
...
MyList.Add(P);