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 :

Optimisation requête SQLite


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut Optimisation requête SQLite
    Bonjour,

    J'aimerais avoir votre avis concernant le temps de chargement des requêtes de mon applications.

    J'initialise mon application par des insert et des Query

    Pour une soixantaine de requêtes, je mets 3 secondes. Ca me parait beaucoup ?

    Merci de vos avis

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Salut,

    Effectivement ça peut paraitre long pour un utilisateur lambda. Mais cela dépend bien sûr du type de ton application (c'est à dire, pour un jeu 3D ça me dérange pas de patienter 3 sec, mais pour lancer une calculette, je trouve ça pénible).

    Techniquement, peux tu nous décrire pourquoi tu fais des insert / query à chaque coup ? c'est obligatoire de le refaire à chaque lancement ?
    Ta base est complexe ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Bonjour,

    merci de ta réponse. Je finalise une application de video-surveillance avec la gestion de plusieurs types de camera et la gestion des mouvements des cameras.

    Je suis en train d'optimiser l'application mais sur certaines activités le temps d'attente peut etre de plus de 10 secondes au minimum.

    J'ai tracé chaque ligne pr voir ou déconne, je commence donc par le début de mon application, c'est à dire l'initialisation.

    Dans cette phase, j'initialise ma BD avec des cameras pour que mon application ne soit pas vide. Cette phase peut déjà durer 3 à 4 secondes. J'appelle une classe que j'ai simplifié mais qui ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    package com.eyeseeyou;
     
    import java.util.ArrayList;
     
    import android.content.Context;
    import android.util.Log;
     
    public class InitBd {
     
    	private DBAdapter db;
    	private Context context;
    	private Profil profil;
    	private Camera camera;
     
    	//Connexion BD query
        private ArrayList<Camera> listCam;
     
    	public InitBd(Context _context){
    		context = _context;
    		init();
    	}
     
    	public void init(){
    		db = new DBAdapter(context);
    		db.open();
    		db.insererUneCamera(camera);
    		db.getAllListeDesCameras().add(camera);
    		camera = new Camera(.......................);
    		db.insererUneCamera(camera);
    		db.getAllListeDesCameras().add(camera);
    		camera = new Camera(.......................);
    		db.insererUneCamera(camera);
    		db.getAllListeDesCameras().add(camera);
    		camera = new Camera(........................);
    		db.insererUneCamera(camera);
    		db.getAllListeDesCameras().add(camera);
    		db.close();
    	}
     
    }
    Il y a peut etre une mauvaise utilisation mais en tt cas je trouve l'utilisation de sqlite avec Android pas vraiment optimum car on doit vraiment bien gérer la gestion de l'open et du close selon cycle de vie, selon l'activité etc...

    Comparer avec le dev pour les iphones ou tu ouvres en début de l'application puis tu fermes à la fin.

    En tt cas, j'espére que j'ai bien fait une erreur quelque part, car mes connections sont trop lente à mon gout

    Ps: je précise que c'est le remplissage ou la lecture de ma BD qui est lente et non la lecture des flux de cameras qui marche bien.
    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    J'ai encore une question, en testant un peu je ne comprends une chose. Si je mets cette classe initBd dans le oncreate ou plutot ds le onResume() (si je fais pas erreur c'est preferable a ce niveau là), cela dure entre 3 et 4 secondes.

    Maintenant si je le met dans un thread en arriére plan (et dc pas ds le thread de l'interface utilisateur) cela prend 14 seondes.

    Comment cela s'explique ?

    Merci

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Dans cette phase, j'initialise ma BD avec des cameras pour que mon application ne soit pas vide. Cette phase peut déjà durer 3 à 4 secondes. J'appelle une classe que j'ai simplifié mais qui ressemble à cela
    Combien en insère tu ?
    Si c'est comme sur ton exemple ou tu insère 3 ou 4 caméras ça me parait énorme. Peut être envisager une méthode du type insertCameras(ArrayList Cameras) qui va venir insérer plusieurs camera en une seule fois.

    Peut on voir comment tu insères tes données (même un peu édulcoré si c'est sensible).

    Cependant il ne faut pas perdre de vu que il ne sera jamais possible d'obtenir les même performance que l'on peut avoir avec un SGBD classique de part la puissance réduite des devices (comparé à un serveur).

    Si je mets cette classe initBd dans le oncreate ou plutot ds le onResume()
    As tu réellement besoin de réinsérer des données à chaque focus de ton activity ? Dans l'idée , une fois stockée , tu n'as plus besoin de réinsérer tes données.
    On pourrait même imaginer que cette intialisation se fait pendant un splashscreen et ne se refera que si la bdd est vide.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Par défaut
    Coucou,

    j'ai pas tout compris mais pourquoi tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    db.insererUneCamera(camera);
    db.getAllListeDesCameras().add(camera);
    Si j'ai compris : DBAdapter c'est ta couche DAO qui écrit et lit dans la database.
    Donc à l'init tu ajoutes une camera avec le insererUneCamera mais ensuite tu fais un db.getAllListeDesCameras().add(camera); ? Pourquoi ?
    Car db.getAllListeDesCameras() n'est pas déjà un appel à ta base pour aller chercher la liste des cameras ? Pourquoi avoir besoin de rajouter dedans ta camera si celui-ci y est déjà puisque tu l'as déjà ajouté au dessus ?
    J'ai l'impression que tu fais une requete d'insert puis un select 4 fois de suite ?
    Je me trompe peut etre sur la méthode db.getAllListeDesCameras(). Dans ce cas ignore ce message.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Par défaut
    Merci à vous 2, pour répondre à vos questions :

    Combien en insère tu ?
    Une cinquantaine d'insert qui dure donc approximativement 17 secondes. Je me suis trompé dans mes traces

    As tu réellement besoin de réinsérer des données à chaque focus de ton activity ?
    C'est déjà fait, j'utilise un SharedPreferences pour voir si mon application a été initialisé. Donc cette classe est appelé uniquement une fois normalement. Comme je l'ai dit c'est pour comprendre et oiptimiser car je fais d'autres requêtes ds mon application. Je commence par le début. C'est qd même vraiment problématique...

    J'ai l'impression que tu fais une requete d'insert puis un select 4 fois de suite ?
    Tu as raison je suis allé un peu vite, je n'ai pas besoin de lire ma query. Je l'ai modifié mais cela n'a aucun effet sur le temps. Le vrai problème semble être les insert.

    Voici le code de l'insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // ajoute une camera
    	public long insererUneCamera(Camera camera) {	
    		ContentValues values = new ContentValues();
    		values.put(COLONNE_SELECT, champ1);
    		values.put(COLONNE_NOM, champ2);
    		values.put(COLONNE_ACTIVE, champ3);
    		values.put(COLONNE_ADRESSE, champ4);
    		values.put(COLONNE_PORT, champ5);
    		values.put(COLONNE_LOGIN, champ6);
    		......
                    ......
    		return db.insert(TABLE_CAMERAS, null, values);
    	}
    J'ai à peu près 20 champs.... Je ne sais pas trop quoi faire, quel testes je pourrais faire pour trouver le vrai souci....

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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