Forum Programmation.c Une base de donnée intégrée ?

Posté par  (site Web personnel) .
Étiquettes : aucune
0
28
août
2004
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  . Évalué à 2.

    Il me semble que gnome-db, c'est uniquement la partie graphique. Pour l'acces au bases de données c'est libgda.

    T'auras plus de renseignement la : http://www.gnome-db.org/(...)
  • # Berkeley DB

    Posté par  (site Web personnel) . Évalué à 2.

    C'est pas "mini berkeleydb" c'est "Berkeley DB": http://www.sleepycat.com/(...) (ou alors yen a un autre que je connais pas)

    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  (site Web personnel) . Évalué à 2.

      en fait, ça a l'air nickel sauf un point : Je veux pouvoir retrouver mes données via deux clés différentes : le path ou le ash.

      Or, berkeleydb ne semble pouvoir avoir qu'un couple (clé, valeur)
  • # ajout

    Posté par  (site Web personnel) . Évalué à 2.

    Je rajoute que l'opération majoritaire sur ma db sera :

    "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)
  • # quid de gdbm ?

    Posté par  (site Web personnel) . Évalué à 2.

    http://www.vivtek.com/gdbm.html(...)

    ça à l'air pas mal du tout non ?
  • # Enlightenment

    Posté par  . Évalué à 2.

    Bon, je sais ce n'est pas fini mais presque :
    http://enlightenment.org/pages/edb.html(...)
  • # simplicité de sqlite

    Posté par  (site Web personnel) . Évalué à 1.

    Je comprends que la bdd sera très petite (moins de 16 Mo).

    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  (site Web personnel) . Évalué à 1.

    Je vais peut-être dire une bétise, mais une base type annuaire (LDAP) ne semble également convenir. Elle est particulèrement adaptée a ton problème avec des gros volumes et des lectures majoritaire (les annuaire sont orientés lecture, et par conséquent mauvais en temps d'écriture). Ce qui n'est pas le cas ici. Sinon, vu les volumes / containte, le mieux est d'utilister une solution standard, portable et largement diffusée (pour la maintenance future) : SQLite
    • [^] # Re: LDAP

      Posté par  (site Web personnel) . Évalué à 2.

      Il y a moyen d'avoir une base de données LDAP sans un serveur indépendant ?

      pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Et un simple fichier ?

    Posté par  . Évalué à 2.

    'faudrais que tu nous donne un peu plus de détails sur ta base de données.

    - 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 à ceux qui les ont postés. Nous n’en sommes pas responsables.