2010-11-17 7 views
0

J'ai un grand nombre d'entiers séquentiels dont j'ai besoin de faire une recherche, c'est-à-dire que je dois obtenir un offset pour un identifiant de série. Le problème est que je préfère ne pas charger toute la table en mémoire pour construire une table de hachage/dictionnaire en raison de contraintes de mémoire alors que faire? Une solution qui pourrait fonctionner est d'avoir un fichier où le premier entier stocké est l'ID le plus bas utilisé, puis vous écrivez un tableau de zéro entiers un pour chaque id au plus grand (ajouter si nécessaire) et écrire dans l'ID à la bonne position. Par exemple, si l'identifiant le plus bas est 1000 et que vous voulez récupérer le décalage à 20000, vous devez simplement récupérer l'entier à la position 10000 + 20000-1. En utilisant la cartographie de la mémoire, cette technique devrait fonctionner plutôt bien. Est-ce que quelqu'un a eu un problème similaire, est-ce une bonne solution ou existe-t-il un meilleur moyen?Table de correspondance basée sur les fichiers

+0

À quelle fréquence les données changent-elles? – SLaks

+0

Les identifiants seront ajoutés en série (il pourrait y avoir quelques légères lacunes) qui pourraient être remplis plus tard, mais généralement quand un identifiant est défini, il est – Homde

Répondre

0

Vous pouvez utiliser un B-Tree, qui est spécifiquement optimisé pour une utilisation sur des disques durs. Les arbres B sont utilisés par presque toutes les bases de données et tous les systèmes de fichiers modernes.

+0

Ah intéressant. S'il y avait de grandes lacunes dans le B-Tree de l'identifiant, c'est peut-être le chemin à parcourir pour ne pas avoir à stocker trop de clés vides, mais je ne vois pas l'avantage qu'elles offriraient ici puisque vous devriez faire une recherche qu'une simple recherche – Homde

+0

@MattiasK: Si vous mettez à jour les données fréquemment, un arbre B sera meilleur. Si vous ne le mettez jamais à jour, votre idée serait probablement la meilleure. – SLaks

+0

Un arbre binaire ne nécessitera pas une analyse complète pour un seul élément, c'est une opération O (log n) pour traverser les nœuds intermédiaires afin de trouver le nœud feuille approprié. Les recherches par arbre B sont assez rapides dans la plupart des cas, vous ne devriez jamais avoir besoin d'une analyse complète des nœuds feuilles de l'arbre. Vous pouvez effectuer d'autres optimisations sur la façon dont vous stockez les données et utilisez un arbre B +. –

0

Vous pouvez toujours opter pour une base de données. SQLite peut être utilisé si vous n'avez pas besoin de plusieurs applications/processus accédant aux données. Cela crée automatiquement des index pour vous et vous permet d'utiliser des requêtes SQL pour récupérer des informations.

+0

Merci, je sais ce qu'est une base de données, ne laissez pas l'étiquette nosql vous tromper;) – Homde

+0

Je suppose que vous le feriez: P. La question qui se pose alors est la suivante: pourquoi cela ne correspond-il pas à votre besoin? La raison pour laquelle je suggère ceci est que cela ressemble à une solution appropriée parce que c'est une solution B-Tree où le travail est fait pour vous. –

Questions connexes