Qual è il modo migliore per implementare array di lunghezza variabile?
-
08-07-2019 - |
Domanda
Voglio archiviare un grande set di risultati dal database in memoria. Ogni record ha una lunghezza variabile e il tempo di accesso deve essere rapido quanto gli array. Qual è il modo migliore per implementarlo? Stavo pensando di mantenere gli offset in una tabella separata e di archiviare tutti i record consecutivamente? È strano? (Linguaggio di programmazione: Delphi)
Soluzione
Non sono sicuro di seguirti totalmente, ma dai un'occhiata a TList.
Almeno in Delphi 7, è implementato come un arrary di puntatori. Puoi utilizzare la proprietà capacity per pre-allocare l'elenco in anticipo se sai quanti risultati stanno tornando.
L'elenco si espanderà automaticamente se si esaurisce lo spazio. Quanto cresce dipende da quanto è grande l'elenco.
Dai un'occhiata alla fonte dell'unità delle classi per vedere cosa sta facendo.
Modifica: anche in D2009 il supporto genetico è stato aggiunto a TList, il che lo rende un po 'più bello da usare.
Altri suggerimenti
Il modo migliore è probabilmente quello di contenere una serie di puntatori ai record. In questo caso non dovrai occuparti degli offset e le ricerche saranno a tempo costante.
Perché non usare una versione MEMORY del tuo database? La maggior parte ha un modo per mantenere una tabella completa in memoria, di solito coinvolgendo la parola chiave SQL MEMORY. Copieresti la tabella dal disco alla tabella della memoria e quindi potrai utilizzare tutte le normali operazioni del database alla velocità della memoria. So che funziona bene in DBISAM.
Seguendo mj2008 , è possibile utilizzare un TCLientDataset anziché un array di record. Quanto è grande questo set di risultati?
Userei TList e memorizzerei i puntatori nel tuo record.
type
pMyRecord : ^TMyRecord;
...
...
...
var
p : pMyRecord;
...
...
New(p);
with p^ do
begin
...
...
end;
...
MyList.Add(P);