2008-11-12 9 views
1

Je veux stocker un grand ensemble de résultats de la base de données en mémoire. Chaque enregistrement a une longueur variable et le temps d'accès doit être aussi rapide que les tableaux. Quelle est la meilleure façon de mettre en œuvre cela? Je pensais garder les compensations dans une table séparée et stocker tous les enregistrements consécutivement? Est-ce étrange? (Langage de programmation: Delphi)Quelle est la meilleure façon d'implémenter des tableaux de longueur variable?

+0

Il est utile de savoir quel langage de programmation vous envisagez d'utiliser, avec des questions comme celle-ci. – unwind

Répondre

3

Je ne suis pas certaine de vous suivre totalement, mais jetez un coup d'œil à TList. Dans Delphi 7 au moins, il est implémenté comme une artere de pointeurs. Vous pouvez utiliser la propriété capacity pour pré-allouer la liste à l'avance si vous savez combien de résultats reviennent.

La liste va augmenter automatiquement si elle manque d'espace. La croissance dépend de la taille de la liste. Jetez un oeil à la source de l'unité de classes pour voir ce qu'il fait. Editer: Toujours dans D2009, le support générique a été ajouté à TList, ce qui le rend un peu plus agréable à utiliser.

1

Le meilleur moyen est probablement de contenir un tableau de pointeurs vers des enregistrements. Dans ce cas, vous n'aurez pas à faire de compensation, et les recherches seront à temps constant.

+0

Recherches serait toujours temps constant avec la proposition du questionneur. –

0

J'utiliserais TList et stocker des pointeurs sur votre enregistrement.

type 
    pMyRecord : ^TMyRecord; 
... 
... 
... 
var 
    p : pMyRecord; 
... 
... 
New(p); 
with p^ do 
begin 
    ... 
    ... 
end; 
... 
MyList.Add(P); 
0

Pourquoi ne pas utiliser une version mémoire de votre base de données? La plupart ont un moyen de conserver une table complète en mémoire, impliquant généralement le mot-clé SQL MEMORY. Vous copieriez la table à partir du disque vers la table de mémoire, puis pourrez utiliser toutes les opérations de base de données normales à la vitesse de la mémoire. Je sais que cela fonctionne bien dans DBISAM.

0

Après mj2008, vous pouvez utiliser un TCLientDataset au lieu d'un tableau d'enregistrements. Quelle est la taille de ce jeu de résultats?

Questions connexes