J'ai une application qui recherche des fichiers sur l'ordinateur (chemin configurable, type etc). Actuellement, il ajoute des informations à une base de données dès qu'un fichier correspondant est trouvé. Plutôt que je veux garder l'information en mémoire pour une manipulation supplémentaire avant de l'insérer dans la base de données. La liste peut contenir beaucoup d'éléments. Je considère la performance comme un facteur important. J'ai besoin d'itération à travers les éléments, donc une structure qui peut être codée facilement est un autre problème clé. et comment puis-je obtenir des tableaux associatifs de style php pour ce travail?Quel type de données/structure pour stocker les informations de la liste de fichiers?
Répondre
Essayez d'utiliser l'AVL-Tree par http://sourceforge.net/projects/alcinoe/ comme tableau associatif. Il a une méthode itérée pour l'itération rapide. Vous devrez peut-être dériver de son baseclass et implémenter votre propre comparateur, mais il est facile à utiliser.
Des exemples sont inclus.
Si vous utilisez Delphi 2009, vous pouvez utiliser un TDictionary. Il faut deux paramètres génériques. Le premier devrait être une chaîne, pour le nom de fichier, et le second serait le type de données que vous associez. Il a également trois énumérateurs intégrés, un pour les paires clé-valeur, un pour les clés seulement et un pour les valeurs seulement, ce qui rend l'itération facile.
Une autre solution consisterait à utiliser uniquement une TStringList standard.
Tant qu'il est trié et possède des paramètres de duplication autres que dupAccept, vous pouvez utiliser indexof ou indexofname pour rechercher rapidement des éléments dans la liste.
Il a également l'addition d'objets qui vous permet de stocker des informations d'objet attachées au nom. À partir de D2009, TStringList a la propriété OwnsObject qui vous permet de déléguer le nettoyage d'objet à TStringList. Avant D2009, vous devez gérer cela vous-même.
Cela dépendra en grande partie de la façon dont vous allez utiliser la liste et à quelle échelle. Si vous allez l'utiliser en pile ou en file d'attente, un TList fonctionnera correctement. Si vous avez besoin de rechercher dans la liste pour un article spécifique, alors vous aurez besoin de quelque chose qui permet une récupération plus rapide. TDictionary (2009) ou TStringList (avant 2009) serait le choix le plus probable.
Les tableaux dynamiques sont également une possibilité, mais si vous les utilisez, vous voudrez minimiser l'utilisation de SetLength car chaque fois qu'il est appelé, il va réaffecter la mémoire. TList gère cela pour vous, c'est pourquoi j'ai suggéré d'utiliser un TList. Si vous connaissez le nombre de contacts, utilisez un tableau dynamique et définissez sa longueur dès le début.
Si vous avez plus d'éléments que ne rentrent dans la mémoire, vos choix changent également. À ce stade, j'utiliserais soit une table de base de données, soit un tFileStream pour stocker les enregistrements à traiter, puis je chercherais au début de la table/flux pour le traitement.