Problème de boucle avec R

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

Alexandre LEKINA
Messages : 18
Enregistré le : 14 Juin 2007, 14:31
Contact :

Problème de boucle avec R

Messagepar Alexandre LEKINA » 13 Juil 2007, 17:26

Bonjour,
j'aimerais savoir pourquoi R n'arrive pas à effectuer ce calcul ?
En pourtant en C ça fait 30secondes tout de même !!!

Quelqu'un pourrait il me dire comment emmener R à aller plus vite ? y a t il un truc dans R qui pourrait booster cette boucle.

Code : Tout sélectionner

f <- function(){
   print(date())
   nb <- 0
   for(i in 1:1000){
      for(j in 1:30){
         for(k in 1:127){
            l <- k+1
            while(l<=128){
               nb <- i*j*k*l
            }
         }
      }
   }
print(date())   
return (nb)
}
f()


Merci
Encore et toujours de la Sélection de Modèles

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 13 Juil 2007, 17:53

Je ne comprends pas ce que vous voulez faire. Cette fonction retourne un scalaire. Intérêt ??? Si c'est c'est pour vérifier que R n'est pas performant sur les boucles, c'est un bon test. On essaie autant que possible de vectoriser les (vrais!) calculs, la plupart des fonctions math de base (sum, prod,...) acceptant des vecteurs comme arguments.

Renaud

Alexandre LEKINA
Messages : 18
Enregistré le : 14 Juin 2007, 14:31
Contact :

Messagepar Alexandre LEKINA » 14 Juil 2007, 10:26

Renaud Lancelot a écrit :Je ne comprends pas ce que vous voulez faire. Cette fonction retourne un scalaire. Intérêt ??? Si c'est c'est pour vérifier que R n'est pas performant sur les boucles, c'est un bon test. On essaie autant que possible de vectoriser les (vrais!) calculs, la plupart des fonctions math de base (sum, prod,...) acceptant des vecteurs comme arguments.
Renaud


Bonjour Renaud,
Oui en effet c'est pour tester si R est performant pour les boucles. Mais que se passe t'il si on vraiment obligé de faire au minimum 2 boucles ou 1 boucle au vu du test?

Je m'explique, j'ai un programme (sélection de modèles) où je me suis débarrassé des deux premiers for(i in 1:1000), for(j in 1:30), et aussi du while(l <=128), grâce aux méthodes *apply.

Par contre à l'intérieur de la boucle for(k in 1:127) je fais des petits calcul de distance de hellinger (intégrale), et recherche des max. Mais le truc il est toujours super super super super ....lent!!!!!!!!!!

Solution ??
Encore et toujours de la Sélection de Modèles

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 14 Juil 2007, 11:00

Peu de différences de rapidité entre les boucles et les *apply (qui sont des interfaces pour des boucles for: regarder par exemple le code de tapply). Il va peut-être falloir passer par du C. Difficile à dire sans un petit exemple complet de ce que vous chercher à faire.

Renaud

Alexandre LEKINA
Messages : 18
Enregistré le : 14 Juin 2007, 14:31
Contact :

Messagepar Alexandre LEKINA » 14 Juil 2007, 18:18

Bonjour,

Renaud Lancelot a écrit :Peu de différences de rapidité entre les boucles et les *apply (qui sont des interfaces pour des boucles for: regarder par exemple le code de tapply). Il va peut-être falloir passer par du C. Difficile à dire sans un petit exemple complet de ce que vous chercher à faire.
Renaud


Renaud, est possible d'exécuter du code R sous C/C++ ?

Vos calculs, il n'y a pas moyen de
1/ les mettre en LUT (Look Up Table), (une fois pour toutes),
2/ puis ensuite les lire dans la table au lieu de recalculer ?
(c'est un truc courant pour des intégrales/fonctions un peu lourdes quand l'espace d'entrée est discret et pas trop gros).


J'utilise cette approche, mais il y a des contraintes mémoires...
Déja 2 matrices 37268*37268 et R commence à pleurnicher.
D'ailleurs, après plus de 24h ce calcul, j'ai eu une erreur du genre: impossible d'allouer 8Go !, et pourtant j'étais sur un calculateur performant.

Et de toute façon, je suis obligé de comparer mes modèles ou histogramme entre eux suivant un certain critère (c'est là qu'interviennent "les" intégrales) afin d'en sélectionner le 'meilleur'. Et comme j'aimerais calculer le risque (espérance mathématique), je suis obligé de faire du monté carlo !!!
Encore et toujours de la Sélection de Modèles

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 15 Juil 2007, 07:12

Alexandre LEKINA a écrit :Bonjour,

Renaud Lancelot a écrit :Peu de différences de rapidité entre les boucles et les *apply (qui sont des interfaces pour des boucles for: regarder par exemple le code de tapply). Il va peut-être falloir passer par du C. Difficile à dire sans un petit exemple complet de ce que vous chercher à faire.
Renaud


Renaud, est possible d'exécuter du code R sous C/C++ ?


Jamais essayé dans ce sens-là. Le contraire devrait être plus intéressant pour vous.

Vos calculs, il n'y a pas moyen de
1/ les mettre en LUT (Look Up Table), (une fois pour toutes),
2/ puis ensuite les lire dans la table au lieu de recalculer ?
(c'est un truc courant pour des intégrales/fonctions un peu lourdes quand l'espace d'entrée est discret et pas trop gros).


J'utilise cette approche, mais il y a des contraintes mémoires...
Déja 2 matrices 37268*37268 et R commence à pleurnicher.
D'ailleurs, après plus de 24h ce calcul, j'ai eu une erreur du genre: impossible d'allouer 8Go !, et pourtant j'étais sur un calculateur performant.


R effectue tous les calculs dans la RAM et même sous Linux, il y a des limites. Voir les docs livrés avec R, notamment "R installation and administration", dans lequel je lis, p. 28:


The total virtual memory space made available to a 32-bit process3 is limited to 4GB, and on most OSes to 3GB (or even 2GB). The limits for 64-bit processes are much larger.
[...]
Even on 64-bit builds of R there are limits on the size of R objects (see help("Memory-limits"), some of which stem from the use of 32-bit integers (especially in FORTRAN code). On all versions of R, the maximum length (number of elements) of a vector is 2^31 - 1, about 2 billion, and on 64-bit systems the size of a block of memory allocated is limited to 2^34 - 1
bytes (8GB). It is anticipated these will be raised eventually but routine use of 8GB objects is (in 2005) several years off


Et de toute façon, je suis obligé de comparer mes modèles ou histogramme entre eux suivant un certain critère (c'est là qu'interviennent "les" intégrales) afin d'en sélectionner le 'meilleur'. Et comme j'aimerais calculer le risque (espérance mathématique), je suis obligé de faire du monté carlo !!!


J'ai peur que R ne soit pas adapté à votre pb, en tout cas tel que vous le formulez.

Renaud

Alexandre LEKINA
Messages : 18
Enregistré le : 14 Juin 2007, 14:31
Contact :

Messagepar Alexandre LEKINA » 15 Juil 2007, 13:41

Bonjour Renaud, Dennst,

E.V. Dennst a écrit :avez-vous déjà un peu profilé votre code ?
pédestrement où avec Rprof etc
ça indiquerait déjà précisément où se fait le gros de la consommation CPU.
Avec le bon diagnostic, ça sera ensuite plus facile de cibler une solution approprié.
Pas la peine de partir sur des montages compliqués tant que vous n'avez pas 100% optimisé la partie R (algo+codage).
(... et en général on tombe rarement sur une solution optimale dès les 1° codages).


Ma consommation CPU est de 100%. R tourne en plien régime sur un super calculateur!

Merci pour toutes vos réponses. J'essayerais de voir comment passer sous C. Apparemment j'ai pas trop le choix.
Comme quoi, la sélection de modèles dans le cadre d'une famille non emboités reste délicat, en particulier sous R.

Alexandre
Encore et toujours de la Sélection de Modèles

E.V. Dennst

Messagepar E.V. Dennst » 16 Juil 2007, 06:36

Alexandre LEKINA a écrit :Ma consommation CPU est de 100%. R tourne en plien régime sur un super calculateur!

Hum "Ma consommation CPU est de 100%" ne répond pas à la question du profiling.

La question est comment se réparti le temps CPU dans le code R.
Quelles fonctions, quelles instructions précises, consomment combien.
La conso est très rarement équirépartie, très souvent Parétienne, ie 10% des instructions sont responsables de 90% de la conso.
Donc il est intéressant d'identifier qui sont ces 10%.
On a parfois des surprises.

... Et si vous optimisez les 90% du code qui sont responsables de 10% du temps CPU ... vous avez bossé pour rien.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité