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)

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top