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
Répondre
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.
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
@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
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 +. –
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.
Merci, je sais ce qu'est une base de données, ne laissez pas l'étiquette nosql vous tromper;) – Homde
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. –
- 1. noms de table requête basée sur les informations de colonne
- 2. Supprimer d'une table basée sur la date
- 3. Quels sont les bons modules Perl pour la programmation basée sur les flux sur les fichiers?
- 4. Table de correspondance vide par rapport à une table de correspondance non concordante (transformation de recherche)
- 5. Recherche de table Crystal Reports basée sur le paramètre SP
- 6. avec table de correspondance dans NHibernate
- 7. autorisation basée sur les rôles
- 8. GLSL Vertex Shader table de correspondance question
- 9. MYSQL Trouver les données dans une table basée sur l'un des deux champs d'une autre table
- 10. Authentification basée sur les formulaires
- 11. Conception basée sur les règles
- 12. SQL pour retourner une table basée sur l'entrée de chaîne
- 13. iPhone: Création d'une navigation de table basée sur la hiérarchie
- 14. Correspondance des noms de fichiers avec l'ID
- 15. NHibernate fluide, changer dynamiquement Table de correspondance?
- 16. Hibernate et l'interaction basée sur les événements
- 17. analyse de fichier basée sur les règles
- 18. Résolution de conteneur basée sur les critères
- 19. Conception dynamique basée sur les domaines Nhibernate
- 20. SQL Server: position basée sur les marques
- 21. vue basée vs application iphone basée sur les fenêtres
- 22. Autorisation utilisateur MS Sql Server basée sur une table
- 23. Requête SQL basée sur les critères
- 24. Conseil SQL - sélection basée sur la colonne d'une autre table
- 25. Instruction SQL pour diviser une table basée sur une jointure
- 26. activité personnalisée basée sur HandleExternalEventActivity
- 27. MySQL table croisée expression régulière correspondance
- 28. Mise à jour de la table de masse MySQL basée sur les valeurs de la deuxième table
- 29. Fichiers dans une application Web basée sur Windows
- 30. Est-il possible d'utiliser une autorisation basée sur les composants basée sur les métadonnées avec Wicket?
À quelle fréquence les données changent-elles? – SLaks
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