Conseils pour optimiser un script R un peu lourd

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Sophie Leguedois
Messages : 14
Enregistré le : 16 Juin 2010, 13:14
Contact :

Conseils pour optimiser un script R un peu lourd

Messagepar Sophie Leguedois » 10 Avr 2017, 12:35

Bonjour à tous,

Je suis à la recherche de conseils ou d'avis pour rendre le plus efficace possible le script R qui consiste à réaliser les différentes étapes décrites ci-dessous.

1) Sélection aléatoire de N de relevés écologiques voisins dans un cercle de diamètre Dmax (méthode near neighbour search , fonction nn2, paquet RANN)
2) Calcul d'un indice écologique moyen à partir de ces N relevés
a) création d'un tableau croisé espèces-relevés (fonction xtabs)
b) calcul de l'indice écologique pour chacune des paires de N relevés (fonction designdist, paquet vegan)
c) calcul de statistiques résumées des N! indices (moyenne, écart type, quantiles, min, max)
3) Calcul des distances géographiques euclidiennes entre relevés
a) calcul des distances entre les N relevés pris deux à deux (fonction spDists, paquet sp)
b) calcul des statistiques résumées sur les N! distances (moyenne, écart-type, maximum)

J'exécute ce script pour un nombre X d'unités qui ont chacune un nombre de relevés N et une étendue Dmax différents. Puis je répète le tout R fois dans un bootstrap pour évaluer la variabilité de mes résultats. Ce qui fait en tout RxX exécutions du script.

Le tout bien sûr prend pas mal de temps et nécessite de la mémoire vive sachant que le nombre de relevés N peut varier de 10 à 6000 (ce qui me génère des matrices de très grande taille aux étapes 2b et 3a).

J'essaye donc d'optimiser le script en utilisant au mieux des fonctions comme lapply et mclapply (version multi-core de lapply). Auriez-vous une expérience ou des conseils pour positionner au mieux lapply et mclapply dans ce type de calcul emboité ? Je suis contrainte, pour des raisons de mémoire vive, de réaliser, a minima les étapes 2b et 3a dans une boucle séquentielle et éviter ainsi des listes de taille ingérable (X*N!).

Statistiquement vôtre,

SoL

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Conseils pour optimiser un script R un peu lourd

Messagepar Mickael Canouil » 10 Avr 2017, 13:40

Bonjour,

première chose, avez-vous besoin d'optimiser votre script? (Réutilisation fréquente, temps "long" de calculs)

Si la réponse est oui et avant de chercher à optimiser tout ou partie, je vous recommande d'abord d'étudier votre script pour en connaître les "points critiques" en terme de temps de calcul via des outils de monitoring (p.ex. proftools, utils::Rprof, ...)
Une fois ces points identifiés, il conviendra d'estimer s'il peut y avoir un gain suffisant pour chercher à optimiser. Chercher à optimiser les étapes qui requiert le plus de temps en premier lieu et omettre les plus courtes.

Cela étant dit, il est difficile de proposer des solutions concrètes sans codes.

Une astuce pour gagner des millisecondes, utiliser les fonctions de "bases" qui omettent des vérifications des paramètres par exemple:

Code : Tout sélectionner

microbenchmark::microbenchmark(
1:100,
seq(1, 100),
seq_len(100)
)
Mickaël
mickael.canouil.fr | rlille.fr

Sophie Leguedois
Messages : 14
Enregistré le : 16 Juin 2010, 13:14
Contact :

Re: Conseils pour optimiser un script R un peu lourd

Messagepar Sophie Leguedois » 11 Avr 2017, 13:00

Merci pour cette première réponse. Je vais regarder tout ça d'un peu plus près. L'optimisation est nécessaire car le script est trop gourmand en temps.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité