Outil de recherche de vols CFD (SIG / BdD géospatiales)
<< < (5/10) > >>
Eltamin:
Je connais pas PostGis, mais je suppose que
Citation de: PiRK le 20 Octobre 2011 - 00:18:19


Ce qui est instantane c'est quand je fait :
Code:

v = Vol.objects.filter(trace_gps__intersects = GEOMGeometry("POLYGON((5.85 45.3667, 5.9667 45.3667, 5.8333 45.2667, 5.85 45.3667))")).order_by('-distance')

Ca te fait un prepared statement lors de l'instanciation de v, mais à ce moment là la requete n'est pas éxécutée.

Citation

Et ce qui prend du temps c'est d'acceder a un element ou tous les elements de v :
Code:

print(v)   # 45 s
print(v[156].distance)  # 15 s
for tmp in v:
    print (tmp.date, tmp.pilote, tmp.distance)   # 45 s
len(v)    # 45 s pour 2476 traces

A noter que dans le cas des commandes qui accedent a toutes les donnees (len(v), print(v) ou la boucle for), seule la premiere prend du temps. Les suivantes sont instantanees.

Je fais l'equivalent de la boucle for dans mon template de page web, je perd peut etre de la performance avec la couche django.contrib.template.


Quand tu accèdes pour la première fois à ta ressource (ton instance v) la requête postgresql est exécutée. Ce qui est bizarre c'est que print(v[156].distance) mette ensuite 15sec. Cela voudrait dire qu'une requete spécifique est réalisée pour accéder à cet élément. Marc va me corriger sur le python, mais je pense qu'à chaque accès à une donnée de ta liste v, tu crées une nouvelle instance d'un objet postgis ou que sais-je (ton v[156] ou tous les tmp dans la boucle) et qu'à chaque fois une requete est exécutée (on a les mêmes problèmes avec des couches d'abstractions de bdd en php comme doctrine ou propel)

Tu pourrais sniffer ce qu'il se passe entre ta base postgresql et ton programme avec un bon vieux Code:

tcpdump -Xvv port "portdelabdd"
, ou débugger chaque requete sql depuis python et ainsi voir exactement quelles requetes sont exécutées et à quel moment. Y'a pas moyen de construire ton v comme une liste imbriquée de données ou alors une liste avec des dictionnaires imbriqués et non pas une liste d'objets postgis, comme ça a l'air d'être le cas (puisque distance est un membre de l'instance v[156] dans l'exemple) ? Ca te ferait une bonne grosse liste en mémoire (quoique 2476 éléments y'a pire...) mais une seule requête initiale (ça fait un bail que j'ai fait ni python ni sql hein, pas tapper :D )
PiRK:
Citation de: Eltamin le 20 Octobre 2011 - 00:36:01



Quand tu accèdes pour la première fois à ta ressource (ton instance v) la requête postgresql est exécutée. Ce qui est bizarre c'est que print(v[156].distance) mette ensuite 15sec. Cela voudrait dire qu'une requete spécifique est réalisée pour accéder à cet élément. Marc va me corriger sur le python, mais je pense qu'à chaque accès à une donnée de ta liste v, tu crées une nouvelle instance d'un objet postgis ou que sais-je (ton v[156] ou tous les tmp dans la boucle) et qu'à chaque fois une requete est exécutée (on a les mêmes problèmes avec des couches d'abstractions de bdd en php comme doctrine ou propel)
Ce que je voulais dire c'est que chacune de ces commandes met le temps spécifié si je l'execute directement apres l'instanciation de v. Mais une fois que j'ai executé une commande qui accede a toutes les données, les suivantes prennent chacune moins d'une seconde (y compris l'acces a un champ distance d'un element v[156]).
Donc je suppose que si je lance n'importe quelle commande qui doit acceder a au moins un champ de chaque element, ca force la requete a etre completement executee et on doit se retrouver avec une simple liste d'objets python en memoire.


Pour en revenir a l'histoire de la simplification de la trace, on m'a dit sur un autre forum que l'algo utilisé par "simplify" est Douglas-Peuker. Ca a l'air bien efficace pour ecremer la trace en gardant la forme generale, j'ai hate d'avoir le temps de le tester (en ce moment je passe moins d'une heure devant un pc par jour, trop de vrai boulot  :( ).  Mais on va forcement perdre des donnees dans l'affaire.
marc:
Simplify <=> DP, c'est marqué dans la doc ;)
Citation

GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False)
Returns a new GEOSGeometry, simplified using the Douglas-Peucker algorithm to the specified tolerance. A higher tolerance value implies less points in the output. If no tolerance is tolerance provided, it defaults to 0.

By default, this function does not preserve topology - e.g., Polygon objects can be split, collapsed into lines or disappear. Polygon holes can be created or disappear, and lines can cross. By specifying preserve_topology=True, the result will have the same dimension and number of components as the input, however, this is significantly slower.


Sinon, tu peux rapeller sur quelle type de machine tu fais tes tests ? Je crois que tu parlais d'un EeePC à un moment... Les BD restent des applications relativement gourmandes en ressources. Si ton code est facilement distribuable, je peux tester sur la machine que j'utilise pour mes tests.
PiRK:

Citation de: marc le 20 Octobre 2011 - 09:04:57

Sinon, tu peux rapeller sur quelle type de machine tu fais tes tests ? Je crois que tu parlais d'un EeePC à un moment... Les BD restent des applications relativement gourmandes en ressources. Si ton code est facilement distribuable, je peux tester sur la machine que j'utilise pour mes tests.

Oui, c'est un EeePC avec 1 Go de ram, c'est pas tres performant comme bete. Et je fait mes test sous windows, ce qui n'arrange pas les choses. Je vais essayer de mettre ce que j'ai deja fait en ligne quand j'aurais le temps. Il ne doit pas y avoir grand chose a adapter, juste un ou deux noms de fichiers codés en dur dans ma fonction de chargement des traces GPS.

Citation

GEOSGeometry.simplify(tolerance=0.0, preserve_topology=False)
Returns a new GEOSGeometry, simplified using the Douglas-Peucker algorithm to the specified tolerance. A higher tolerance value implies less points in the output. If no tolerance is tolerance provided, it defaults to 0.

By default, this function does not preserve topology - e.g., Polygon objects can be split, collapsed into lines or disappear. Polygon holes can be created or disappear, and lines can cross. By specifying preserve_topology=True, the result will have the same dimension and number of components as the input, however, this is significantly slower.

J'ai pas reussi a trouver dans quelle unité la tolerance doit etre exprimé. Metres ? Degres ? Minutes d'arc ?
marc:
Citation de: PiRK le 20 Octobre 2011 - 09:13:41


Citation de: marc le 20 Octobre 2011 - 09:04:57

Sinon, tu peux rapeller sur quelle type de machine tu fais tes tests ? Je crois que tu parlais d'un EeePC à un moment... Les BD restent des applications relativement gourmandes en ressources. Si ton code est facilement distribuable, je peux tester sur la machine que j'utilise pour mes tests.

Oui, c'est un EeePC avec 1 Go de ram, c'est pas tres performant comme bete. Et je fait mes test sous windows, ce qui n'arrange pas les choses. Je vais essayer de mettre ce que j'ai deja fait en ligne quand j'aurais le temps. Il ne doit pas y avoir grand chose a adapter, juste un ou deux noms de fichiers codés en dur dans ma fonction de chargement des traces GPS.


tu me dis !
Citation

J'ai pas reussi a trouver dans quelle unité la tolerance doit etre exprimé. Metres ? Degres ? Minutes d'arc ?


en général, quand rien n'est spécifié pour les unité, c'est que c'est "agnostique", la distance étant calculée classiquement à partir des coordonnées que tu donnes. Si tu donnes des coord GPS (lat/lon), tu travailles avec des mesures d'angle... Je t'avoue que je me suis pas casser la tête quand j'ai eu à faire un échantillonnage basé sur la distance: j'ai regardé quelle était la distance mesurée de 2 points que je savais à 50m l'un de l'autre et ai utilisé cette valeur... C'est un peu approximatif (en principe, la terre n'étant pas ronde, la correspondance angle/distance projetée n'est pas constante avec la position).
Si tu veux un truc un peu plus exact, tu dois pouvoir jouer avec la classe Distance offerte par GeoDjango... Mais là, ça me semble un peu overkill. Ma bidouille devrait déjà donner des résultats acceptables ;)
Navigation
Index des messages
Page suivante
Page précédente