none
Optimisation de requette Linq + Event RRS feed

  • Question

  • Bonjour,

    J'ai un requette linq qui me pose des probleme de performance.

    je souhaite savoir si il est posible de l'optimisé, ou si il est possible en linq de recuperer un event pour connaitre l'avancement de l'execution de la requette.

    voici la requette :

                    Dim lResultat = (From l In qlen
                             From c In OutFiles
                             Where l.Length = c.Length
                             Select c).ToList

     

    - qlen contient une liste de class avec 2 property (l.length,l.count) il contient environ 13 000 element

    - OutFiles est une collection qui contient environ 80 000 element (et une propert length).

    le but est de retrouver tout les fichier contenu dans OutFiles qui on la longeur qui ce trouve dans une des lignes de qlen.

     

    Donc je recherceh soit :

        - a optimiser la requette, car elle dur tres longtemps ... (je ne l'es pas encors laisser aller jusq'au bout, mais 20 a 30mn ce sont deja passé)

       - avoir un evenement sur l'etat d'avancement de la requette linq (ce qui me permettrai de faire patienter l'utilisaeeur, et peu etre suvivant l'event de calculer un temps aproximatif ...

     

    Est ce que quelleq'un aurait une piste ?

    merci.

     


    Cordialement Sébastien DataBase2Code
    dimanche 21 août 2011 09:28

Réponses

  • Bonjour,

    Oui c'est exactement ce que je m'etait dit.

    Voila la solution du probleme (un collegue me la fournis)

         Dim qall = (From p In OutFiles
                                Group By p.Length Into g = Group
                                Where g.Count() > 1
                               From f In g
                                Select f).ToList()
    

    et maintenant c'est instantané !

    Merci Linq et a tous ce qui ce sont pancher sur mon probleme.

    ++

     

     


    Cordialement Sébastien DataBase2Code
    lundi 22 août 2011 08:59

Toutes les réponses

  • Bonjour,

    A priori on va comparer chacune des 80000 longueurs d'une liste avec chacune des 13000  longueurs de l'autre d'où le temps (80000 * 13000 itérations).

    Je pense qu'il pourrait plus efficace de le faire sur des données triées en avançant dans les deux listes triées en "parallèle" (on avance toujours dans celle qui a la propriété "Longueur" la plus petite) ce qui permettrait d'avoir le résultat en n'ayant parcouru au pire qu'une seule fois chacune de ces deux listes triées.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    dimanche 21 août 2011 16:30
    Modérateur
  • Bonjour,

    Oui c'est exactement ce que je m'etait dit.

    Voila la solution du probleme (un collegue me la fournis)

         Dim qall = (From p In OutFiles
                                Group By p.Length Into g = Group
                                Where g.Count() > 1
                               From f In g
                                Select f).ToList()
    

    et maintenant c'est instantané !

    Merci Linq et a tous ce qui ce sont pancher sur mon probleme.

    ++

     

     


    Cordialement Sébastien DataBase2Code
    lundi 22 août 2011 08:59
  • Je vois par contre que qLen a disparu mais je crois comprendre maintenant que l'on voulait faire un regroupement et non pas sélectionner dans une liste en fonction du contenu arbitraire d'une autre liste ce que me laissait supposer la requête d'origine.

    Je trouve souvent utile de donner une brève vue d'ensemble du sujet hors de toute considération technique ce qui permet parfois d'éviter de s'escrimer sur une solution donnée qui ne répond en fait pas au problème d'origine.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 22 août 2011 09:16
    Modérateur
  • En faite a la base c'etait 2 requette separer

    'ON recherche les fichier qui on la meme longeur
                    Dim qlen = (From p In OutFiles
                          Group By p.Length Into g = Group
                          Where g.Count() > 1
                          Select Length, g.Count Order By Length)
     
                    'on recherche tout les class pour laquelle longeur est identique
                    Dim lResultat2 = (From l In qlen
                          Join c In OutFiles On l.Length Equals c.Length
                          Where l.Length = c.Length
                          Select c).ToList()
    

    la deuxieme requette est elle aussi instantané et remplace le probleme de base rencontrer dans mon message de debut.

    ensuite mon collegue ma conseillé de passer sur une seul requette qui fait le resultat des 2 requettes. et on reste sur de l'instantané egalement !

    ++

     


    Cordialement Sébastien DataBase2Code
    lundi 22 août 2011 09:20
  • Oui, j'ai bien compris en voyant la solution.

    D'où justement mon conseil d'essayer de toujours indiquer en français l'objectif général (par exemple ici "je veux compter le nombre d'élements pour chaque longueur à partir de la liste OutFiles").

    Exemple récent sur un forum US : dans une appli web qq veut "enregistrer le chemin du fichier choisi par l'utilisateur". Comme la demande parait suspecte après discussion, le but est bien d'afficher le fichier sur le site web et il faut donc bien enregistrer le contenu du fichier et son chemin sur le disque dur de l'utilisateur n'a effectivement aucun intérêt.

    Avoir le but général permet éventuellement de voir que la solution en cours de mise en place et qui cause le problème n'est de toute façon pas adaptée.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    lundi 22 août 2011 11:33
    Modérateur