Organiser et mettre à jour une collection de relevés

27 views
Skip to first unread message

Ben

unread,
Apr 30, 2016, 5:00:52 PM4/30/16
to cloju...@googlegroups.com

Bonjour à tous, 

J'aurais besoin de quelques idées :-) sur les thèmes suivants:

  • comment structurer correctement ses données?
  • comment manipuler ces données en fonction des contraintes qu'on va s'imposer

Je fais un petit outil de relevés de temps d'accès pour une application en fonction de la localisation de la passerelle d'accès et des actions effectuées sur l'application.

Pour cela, j'utlise clj-webdriver et tout simplement la fonction clojure.core/time. J'ai une application centrale mais plusieurs points d'entrées: direct, ou en passant par la passerelle EMEA, ou APAC, etc. Et les actions que je relève sont aussi diverses: login, recherche, accès aux comptes. Et bien sûr je vais pas mal de tests de suite pour avoir des chiffres significatifs. Du coup ça commence à devenir doucement touffu.

À la fin, je veux pouvoir faire des calculs sur ces relevés (moyenne, médiane, sd,…)

Je suis parti un peu bille en tête pour tirer profit de la STM avec un atom utilisant une nested map avec les valeurs dans un vecteur.

Cela pourrait donner, en réduit, quelque chose comme cela (valeurs bogus):

(def teststats (atom
                {:direct
                 {:login ["1005.180502", "1021.050212", "934.23156" ]
                  :search ["2005.180502", "2021.050212", "20934.23156" ]
                  :accounts ["3005.180502", "3021.050212", "30934.23156" ]
                  :opportunities ["3005.180502", "3021.050212", "30934.23156" ]
                  }
                :emea
                 {:login ["1105.180502", "1121.050212", "11934.23156" ]
                  :search ["2105.180502", "2121.050212", "21934.23156" ]
                  :accounts ["3105.180502", "3121.050212", "31934.23156" ]
                  :opportunities ["3105.180502", "3121.050212", "31934.23156" ]}}
                ))

Mes questions sont les suivantes:

  • est-ce que c'est se compliquer la vie pour rien? est-ce qu'il ne vaut pas mieux se prendre une armée de vecteurs de niveau 1 genre (def emea-passe-1 [1, 1.2, 1.1, ..]) puis emea-passe-2, 3, 4? – les valeurs groupées dans un vecteur me semblent intéressantes car on peut ensuite les passer directement à Incanter.
  • si une belle structure compliquée et imbriquée est nécessaire, comment ajouter des valeurs au vecteur à l'intérieur de la map? j'ai tenté quelques variations sur (swap! teststats conj [:direct :login "1234"]) et autre update-in mais sans résultat – l'objectif étant que la première entrée devienne:

    :login ["1005.180502", "1021.050212", "934.23156" "1234"]
    

Merci pour toute indication!

– Ben

Mathieu Corbin

unread,
Apr 30, 2016, 5:25:05 PM4/30/16
to cloju...@googlegroups.com
Salut,

Pour la première question, je n'ai pas vraiment compris ce que représenterait les vecteurs de niveau 1 (notamment pour différencier les différents types d'actions comme dans la map).

Pour ta seconde question, quelque chose de ce genre permet de rajouter une valeur à :login :

(defn update-atom
  [state value]
  (update-in state [:direct :login] conj value))

(swap! teststats update-atom "1234")

Tu pourrais même passer en paramètre de la fonction les keywords à mettre à jour.

PS : J'aimerais bien avoir ton retour sur la performance de la STM sur ce genre de structures (surtout si tes tests bombardent bien).

Cordialement,

Mathieu


--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "clojure-fr".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse clojure-fr+...@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Ben

unread,
May 1, 2016, 10:52:36 AM5/1/16
to cloju...@googlegroups.com

Bonjour à tous, bonjour Mathieu, 

merci pour cette réponse. 

Pour la première question, je n'ai pas vraiment compris ce que représenterait les vecteurs de niveau 1 (notamment pour différencier les différents types d'actions comme dans la map).


En fait c'était juste avoir un vecteur simple par couple host-action. 
emea-action1 [vals]
emea-action2 [vals]
etc. 
et ensuite traiter et comparer chaque vecteur. Plutôt que d'avoir un truc compliqué imbriqué. 
Parfois je me demande si je ne cherche pas toujours à sur-compliquer. 
 
Pour ta seconde question, quelque chose de ce genre permet de rajouter une valeur à :login :

Ah, oui, merci! 
 

PS : J'aimerais bien avoir ton retour sur la performance de la STM sur ce genre de structures (surtout si tes tests bombardent bien).


Je ne suis pas sûr d'avoir le bon cas d'usage pour un test de perf STM malheureusement: ces tests sont très dépendants de la bande passante / latence ; j'ai remarqué qu'une valeur typique seule est 5-10 sec pour une opération mais quand j'en lance 5 ou 6 en parallèle, ça monte à 120sec de traitement (!) ; du coup je prends du temps pour réaliser les tests: en séquence, patiemment, pour être sûr que chaque test dispose de la bande passante nécessaire. C'est un truc pépère, sans bombardement :) ; je peux tenter le coup en parallèle, mais clj-webdriver est très pointilleux et produit une méchante erreur quand il ne trouve pas les keywords dont il a besoin. 

(j'ai remarqué un comportement similaire pour Incanter d'ailleurs: je lui passe un csv de valeurs de 200-300Mo de taille pour que cela passe niveau RAM il est nécessaire de lui donner du :jvm-opts ["-Xms2g" "-Xmx8g" ] ; je suis étonné par l'expansion mais comme ça passe ainsi, je n'ai pas cherché bien plus loin). 

Merci encore Mathieu pour ton aide! 

 -- Ben

jeremy schoffen

unread,
Aug 19, 2016, 7:30:02 PM8/19/16
to clojure-fr
Bonjour à tous,

Tout d'abord l'armée de vecteurs, chacun dans sa variable globale... pas génial de mon point de vue, a vrai dire ta façon de structurer les données me parait raisonnable. Et quand les fonctions classiques de clojure.core deviennent insuffisantes pour gérer de des structures complexes, jette un oeil à bibliothèque specter. La documentation est pauvre mais il y a 1 ou 2 video du créateur qui sont géniales. Cette bibliothèque vaut vraiment d'être connue.

Ensuite j'ai une petite remarque, si tu utilise un "atom", tu n'utilise pas la STM. Les "atoms" de clojure utilisent la stratégie "compare and swap".
Ce sont les "refs" qui utilisent la STM. Par exemple:
 
(def c1 (ref 0))
(def c2 (ref 0))

(dosync 
  (alter c1 inc)
  (alter c2 dec))

Cordialement,

Jeremy.
Reply all
Reply to author
Forward
0 new messages