IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[sqlite] 4ms pour une ligne?


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Points : 50
    Points
    50
    Par défaut [sqlite] 4ms pour une ligne?
    Bonjour,

    je suis entrain de développé ma première vrais applications sur android et j'ai un petit souci de lenteur. Enfaîte je doit au premier lancement de l'application une certaine liste d'objets récupérer via un web-service (au format Json) et en remplir une table sqlite.

    Pour l'instant je télécharge et parse mon json pour le transformer en une liste de 5000 objets (trés rapide ~5s) et l'enregistre en base de donnée (1 table pour tout les champs, 1 tables en fts4 avec id/clef étrangère sur la première et un seul autre champs) ligne par ligne ce qui prend ~7 minutes. Beaucoup trop.

    J'avais pensé à un import, mais écrire les données en csv pour après les importé ne me semble pas une bonne idée.

    Donc si quelqu'un à des idées d'optimisations je lui en serait reconnaissant.

    PS: le téléphone est un SGS2.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pas le choix, l'insert se fait ligne par ligne...

    Par contre, il faut le faire en batch pour aller plus vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    beginTransaction()
    for (Element e : listeElements) {
       insertInDB(e);
       ++count;
       if (count % BATCH_SIZE == 0) {
          setTransactionSuccessful();
          endTransaction();
          beginTransaction();
       }
    }
    setTransactionSuccessful();
    endTransaction();
    Faire varier BATCH_SIZE pour voir si cela améliore ou non la rapidité.

    Sinon cette table est référencée par d'autres tables de la base ?
    Si ce n'est pas le cas, peut-être serait-il plus utile de directement renvoyer le fichier sqlite (zippé), et de l'utiliser directement.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Tu peux également essayer de jouer sur le PRAGMA synchronous avant ton insertion :

    http://www.sqlite.org/pragma.html#pragma_synchronous

    Le passer à 0 améliore très sensiblement la vitesse d'écriture.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Points : 50
    Points
    50
    Par défaut
    Du coup j'ai essayer mes transactions en batch et le moins que je puisse dire c'est que c'est efficace. En mettant un batch au pif à 50 Je suis tombé à 3.6s pour tout enregistrer .

    Si j'ai bien compris avec cette méthode sqlite prépare et garde en mémoire une cinquantaine de lignes (dans mon cas) avant de les écrire dans le fichier, c'est vrais que l’accès mémoire coûte chère..

    En tout cas merci pour vos réponse, elles m'ont bien aider. Sujet résolu.


    PS: j'irai aussi voir pour le PRAGMA, on est jamais trop rapide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. enabled à false pour une ligne d'un Stringgrid
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 2
    Dernier message: 17/10/2006, 09h55
  2. instruction valable pour une ligne d'une table
    Par Skizo dans le forum Access
    Réponses: 2
    Dernier message: 18/05/2006, 15h51
  3. modification de données pour une ligne
    Par Skizo dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 11h05
  4. [MySQL] Pour une ligne ca marche, mais si plusieurs ligne ca foire
    Par twixster dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 16/02/2006, 12h57
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo