Forum général.général Base de donnée légère

Posté par  (site web personnel) .
Étiquettes : aucune
3
23
août
2010
Bonjour,

Je me demande s'il existe d'autres bases de données aussi légère que sqlite mais plus performante (au niveau gestion des indexes, temps d'insertion, ....) ?

Je ne souhaite pas installer de serveur. Une seul application doit pouvoir y accéder (mais l'application peut-être multitâche, une tâche écriture, un tâche GUI lecture).

J'ai voulu essayé Mysql embedded mais je n'ai pas compris son fonctionnement (faut-il démarrer un serveur ? faut-il absolument un fichier my.cnf ?).
La moindre erreur fait apparemment quitter le programme, pas moyen d'afficher le code erreur :(.

En connaissez-vous d'autres (fonctionnant avec C/C++), et pas en JAVA (j'ai vu qu'il en existait en JAVA mais elle ne m'intéresse pas).

Autre question : A partir de quel moment faut-il choisir une base de donnée non relationnelle ? (Il existe des BDD de type clé, valeur, ....). Quel sont tout les types de bases existante autre que BDD relationnel ?


Mon but est de stocker pour une série de fichier le contenue (variable, nom de méthode, paramètre, ...), les références externes, .... pour faire un éditeur avec complétion. Le contrainte, c'est que je peux me retrouver avec des fichiers avec plus de 50 000 valeurs.

SQLite est assez long sur l'insertion (surtout avec les indexes), et sans les indexes est long à la recherche. L'insertion sans les indexes, avec création des indexes à posteriori, ne m'aide pas (temps identique à l'insertion avec index), car je recherche l'existence de la ligne avant de la créer (pour récupérer sont id)

Le code de ce qui est fait actuellement peut-être vu ici : https://svn.shadoware.org/xinx/branches/v0.9.0/framework/con(...)
  • # .

    Posté par  . Évalué à 2.

    Combien de temps pour 50000 valeurs ?
    • [^] # Re: .

      Posté par  (site web personnel) . Évalué à 3.

      L'insertion des 50 000 valeurs avec recherche de l'existence me prend environ 16 secondes.

      Je teste l'existence car je dois constitué relation pour faire un arbre.

      L1 - A1
      - A2
      - A3
      L2 - A4
      - A5

      L1 est créé avec A1, mais existe lors de la création de A2. Sachant que le fichier XML que je lis ne mets pas forcément les informations dans l'ordre.

      La lecture du fichier XML met environ 700ms sans la partie BDD.

      Ce qui me gène avec SQLite, c'est que pendant l'insertion des données (transaction), il n'est plus possible de faire un seul SELECT en lecture.

      Le thread qui se charge de charger les données, bloque donc le thread qui se charge de les afficher. De temps en temps je me retrouve avec un "database is locked".

      Si le fichier se charger plus rapidement ce serait mieux. Si je pouvais avoir accès au contenue de la table avant modification (pendant la transaction), ce le serait aussi.
      • [^] # Re: .

        Posté par  . Évalué à 1.

        regarde du coté des PRAGMA : http://www.sqlite.org/pragma.html#pragma_fullfsync ; il est possible de gerer les synchronisations. Les performances seront bien supérieures sans synchro.
        • [^] # Re: .

          Posté par  (site web personnel) . Évalué à 3.

          J'ai déjà pragma synchronous=OFF

          Pour fullfsync "Only Mac OS X supports F_FULLFSYNC.".
          • [^] # Re: .

            Posté par  . Évalué à 1.

            question : est-ce que par défaut, sqlite ne fait pas du transactionnel pour chaque instruction? Par contre, si tu les écrits explicitement, il pourrait ne faire la transaction que pour l'ensemble.
            • [^] # Re: .

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

              Je fait mes transaction manuellement (si je laisse faire les transaction unitairement, c'est lent, en plus j'ai besoin de pouvoir annuler le bloc si erreur).

              Généralement sur les BDD quand on fait une modif sur un record, les autres (accès concurrents) voient la dernière valeurs avant modif jusqu'à validation de la transaction. Sqlite bloque l'accés :(
          • [^] # Re: .

            Posté par  . Évalué à 1.

            Pour fullfsync "Only Mac OS X supports F_FULLFSYNC.".

            Si c'est un problème de flush disque, tu le verra en mesurant les différences de perfs avec la base :memory: (ou mets ta base sur un ramdisk, ça revient en gros au même).
      • [^] # Re: .

        Posté par  . Évalué à 4.

        Pourquoi tu testes l'existence de l'enregistrement ? Avec un index unique sur L, Sqlite retournera une erreur SQLITE_CONSTRAINT en cas de doublon.

        Tu peux aussi passer par des tables temporaires sans index et avec doublon puis mettre à jour les tables normales dans une seule transaction ou faire plusieurs passes sur le fichier xml.
        • [^] # Re: .

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

          En faite, c'est soit il n'existe pas, et je le créé. Soit il existe dans ce cas il me faut l'id de la clé primaire. Par contre l'existence ne se fait pas sur la clé primaire mais sur l'ensemble des champs de l'enregistrement (à part une ou deux colonnes).

          Sinon cela reviendrai à créer une contrainte pour indiquer unique tout les champs de la table. Mais en cas d'erreur de création, est-il possible de récupérer l'id.

          La table peut-être mis à jour en plusieurs passe. Par exemple, je lis le fichier XML, je stocke dans la base. Puis je lis un nouveau fichier XML, et je ne stock que le mes modifications. Pour cela je vérifie si chaque champ n'existe pas déjà.

          Je regarde si passer par une table temporaire est une solution possible pour moi. Merci pour l'indice.
  • # mauvaise analyse

    Posté par  . Évalué à 3.

    Autre question : A partir de quel moment faut-il choisir une base de donnée non relationnelle ? (Il existe des BDD de type clé, valeur, ....).

    à partir du moment ou tu n'as pas besoin de relation entre les tables :p

    dans ton cas ca ne peut pas etre le cas, car tu as les references externes (qui sont probablement des relations à d'autres lignes de ton tableau)
    • [^] # Re: mauvaise analyse

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

      En effet il y a des relations :
      - Un fichier peut importer d'autres fichiers (et ainsi les variables globale sont accessible).
      - Un fichier peut contenir des variables, des fonctions. Les fonctions peuvent à leur tour contenir des variables, des paramètres, ...

      La base de données est écrite de telle manière que ce soit plus générique (une variable, une fonction, un paramètre, ... représente un nœud, chaque nœud possède un parent; ou non).

      Mais il me semble que SVN utilise la Berkeley_DB qui n'est pas relationnel. Par contre tu tout de même une relation entre les fichiers (copie, déplacement, rev 2 suit la rev 1, ...).
  • # Firebird

    Posté par  . Évalué à 2.

    Avec firebird, tu aura une instruction Update Or Insert :

    UPDATE OR INSERT INTO inventory
    (product_id, stock)
    VALUES
    (:product_id, :stock);

    http://www.developeando.com/2008/12/firebird-21-update-or-in(...)

    En plus, tu as toutes les commodités et la rapidité d'une vrai base de données relationnelle.
    Il y a un mode embedded sans installation (juste des fichiers à copier) mais qui fonctionne seulement sur windows je pense... à vérifier

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.