Hello,
Je suis en train d'écrire un petit programme en C qui tourne sous gnome et qui doit utiliser une base de donnée.
Je cherche un maximum de performance. Il y'a surtout des opérations de lectures, qui sont toutes relativements espacée (quelques dizaines de requètes par minute). Les opérations d'écritures sont quand à elles plus rares.
Le cherche les fonctionnalités suivantes :
- obtenir toutes les propriétés de l'élement UNTEL
- obtenir la propriété X de l'élément UNTEL
- obtenir tous les éléments dans la propriété X est Y
- mettre à Y la propriété X de UNTEL
- obtenir le nombre d'élément dans la table
- obtenir un élément au hasard
cette dernière fonctionnalité est très très importante à mes yeux.
Les éléments comporteront chacun deux champs distinctifs, le nom "path du fichier" et le checksum.
Je précise que le path peut contenir des espaces ou des caractères spéciaux, car en C c'est pas toujours la joie. (oublions scanf :-( )
Les possibilités que je connais de nom sont :
- gnome_db
- sqllite
- et je crois un mini berkeleydb ou qqch du genre
Quels sont les avantages et les inconvénients de chaque ? Et connaissez-vous des bons sites pour apprendre à utiliser ça ?
Merci d'avance
# libgda
Posté par Guillaume Chevallereau . Évalué à 2.
T'auras plus de renseignement la : http://www.gnome-db.org/(...)
[^] # Re: libgda
Posté par ploum (site web personnel, Mastodon) . Évalué à 2.
http://www.gnome-db.org/docs/libgda/index.html(...)
Mes livres CC By-SA : https://ploum.net/livres.html
# Berkeley DB
Posté par Krunch (site web personnel) . Évalué à 2.
J'ai jamais utilisé aucun des trois mais à mon avis si tu veux que ça soit un petit peu portable, gnome_db n'est peut-être pas la bonne solution mais si tu veux que ça soit le plus intégré possible à Gnome alors peut-être... Je pense que Berkeley DB est le plus répandu donc son utilisation peut peut-être réduire les problèmes de dépendances (si ça a une importance...). SQLite est une base de données relationnelle (contrairement à Berkeley DB il me semble), ça peut te servir ou pas selon ce que tu veux faire.
Pour ce qui est de choisir un élément au hasard, je pense que c'est pas trop à la base de données de le faire et si tu sais connaitre la taille de la table, c'est facile à faire.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Berkeley DB
Posté par ploum (site web personnel, Mastodon) . Évalué à 2.
Or, berkeleydb ne semble pouvoir avoir qu'un couple (clé, valeur)
Mes livres CC By-SA : https://ploum.net/livres.html
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 1.
Ce commentaire a été supprimé par l’équipe de modération.
# ajout
Posté par ploum (site web personnel, Mastodon) . Évalué à 2.
"est-ce que UNTEL existe ?"
Or, berkeley ne semble pas supporter facilement cette option. (je ne veux pas recevoir tous l'élément, je veux juste savoir si il existe)
Mes livres CC By-SA : https://ploum.net/livres.html
# quid de gdbm ?
Posté par ploum (site web personnel, Mastodon) . Évalué à 2.
ça à l'air pas mal du tout non ?
Mes livres CC By-SA : https://ploum.net/livres.html
# Enlightenment
Posté par _alex . Évalué à 2.
http://enlightenment.org/pages/edb.html(...)
# simplicité de sqlite
Posté par Yannick Le Saint (site web personnel) . Évalué à 1.
J'ai utilisé sqlite pour la première fois aujourd'hui (depuis python ) et je dois avouer que son utilisation est vraiment triviale, si tu as une quelconque expérience avec les bdd relationnelles.
En ce qui concerne les performances, fait d'abord bien attention à la quantité de ram disponible (ça booste les performances).
# LDAP
Posté par Yannick (site web personnel) . Évalué à 1.
[^] # Re: LDAP
Posté par Krunch (site web personnel) . Évalué à 2.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# Et un simple fichier ?
Posté par Obsidian . Évalué à 2.
- Elle doit être utilisée par un seul programme ou par plusieurs en même temps ?
- Ta liste d'éléments, elle est toute seule ou il y en a plusieurs, avec des relations entre elles ?
Si c'est la première réponse dans les deux cas, et qu'en plus les opérations d'insertion sont rares, alors tu as plus vite fait de mapper un fichier en mémoire avec mmap() ou mmap64(), de récupérer de le pointeur sur la zone et de le caster, genre:
typedef struct _element
{
char element [128];
unsigned long int checksum;
} Element;
Element * ptr;
ptr= mmap (LesArgumentsQuiVontBien);
Le contenu de ton fichier sera alors immédiatement utilisable comme si c'était un tableau en mémoire.Un petit « ptr[x] » pour retrouver immédiatement l'élément x. Simplicité et rapidité: C'est le système qui s'occupe du chargement/déchargement des pages et de choisir leur granularité.
Pour retrouver tous les éléments, un simple balayage de 0 à n-1 éléments. Techniquement, il n'est pas possible de faire plus rapide. Tu peux ajouter un index à tes « éléments », mais si tu dis que les insertions sont rares, tu peux te permettre de les trier en temps réel. Gain de temps à la lecture grandement amélioré !
Le seul tout petit souci que tu peux avoir apparait lorsque tu modifies la structure de Element: Il faut reconstruire le fichier. C'est exactement la même chose avec un SGBD, sauf que l'opération se fait automatiquement lorsque tu lui demande. Quoiqu'il en soit cela reste très simple: Deux définitions de structures, deux pointeurs ptr1 et ptr2, deux mmaps et une boucle qui scanne tous tes éléments, avec à chaque itération une copie de l'une des structure vers l'autre, et c'est fini.
Bonne chance.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.