je rajouterais bien les paragraphes suivants dans la fiche gerer_ressources sur les problèmes de RAM (ce qui permettrait de caser un certain nombre de mes conseils pour les gens venant de SAS) :
Choisir les classes de colonne les plus économes
Chaque colonne d'un data.frame a une classe qui sont plus ou moins gourmandes en mémoire. Grosso modo, dans R, les classes integer, logical et factor sont économes alors que les classes numeric et character prennent beaucoup de cases mémoires. Ainsi il est souvent recommandé de transformer une colonne de character en factor et de vérifier si une colonne de numeric ne peut pas être passée en integer.
Eviter les valeurs manquantes inutiles
Une valeur manquante prend la même place en mémoire qu'une valeur non manquante. Il faut donc chercher à ne pas en abuser. Une valeur est manquante soit quand elle est en attente de remplissage (imputation statistique par exemple), soit quand la remplir serait absurde. Dans ce dernier cas, repenser la structure des bases peut être utile. Prenons une base individuelle contenant le nombre d'enfants de chacun et l'année de naissance des enfants. La structure de base suivante :
id
nb_enfant
annee_naissance_enfant_1
annee_naissance_enfant_2
annee_naissance_enfant_3
annee_naissance_enfant_4
1
4
1980
1982
1986
1990
2
1
1986
NA
NA
NA
3
0
NA
NA
NA
NA
est problématique car, par exemple, la colonne annee_naissance_enfant_4 aura beaucoup de valeurs manquantes et prendra beaucoup de place pour peu d'informations.
La même information peut se mettre en deux bases :
une individuelle réduite :
id
nb_enfant
1
4
2
1
3
0
une spécifique aux années de naissance des enfants :
id
annee_naissance_enfant
1
1980
1
1982
1
1986
1
1990
2
1986
Faire la chasse aux informations redondantes
Le fait que la base tienne dans la RAM permet d'accélérer les calculs. Aussi il est souvent préférable de réduire la taille de la base même au prix de quelques calculs supplémentaires. Par exemple supposons qu'on ait une colonne date_naissance qui soit au format Date et que, très souvent, on ait besoin de l'année naissance ou du mois de naissance de l'individu. Créer les colonnes annee_naissance = year(dateNaissance) et mois_naissance = month(dateNaissance) peut être tentant mais bien souvent la perte de RAM associée à ces deux nouvelles colonnes sera plus dommageable que l'inconvénient de devoir à chaque fois réécrire year(dateNaissance), quitte à demander 30 fois à R de refaire ce petit calcul.
je rajouterais bien les paragraphes suivants dans la fiche gerer_ressources sur les problèmes de RAM (ce qui permettrait de caser un certain nombre de mes conseils pour les gens venant de SAS) :
Choisir les classes de colonne les plus économes
Chaque colonne d'un
data.frame
a une classe qui sont plus ou moins gourmandes en mémoire. Grosso modo, dansR
, les classesinteger
,logical
etfactor
sont économes alors que les classesnumeric
etcharacter
prennent beaucoup de cases mémoires. Ainsi il est souvent recommandé de transformer une colonne decharacter
enfactor
et de vérifier si une colonne denumeric
ne peut pas être passée eninteger
.Eviter les valeurs manquantes inutiles
Une valeur manquante prend la même place en mémoire qu'une valeur non manquante. Il faut donc chercher à ne pas en abuser. Une valeur est manquante soit quand elle est en attente de remplissage (imputation statistique par exemple), soit quand la remplir serait absurde. Dans ce dernier cas, repenser la structure des bases peut être utile. Prenons une base individuelle contenant le nombre d'enfants de chacun et l'année de naissance des enfants. La structure de base suivante :
est problématique car, par exemple, la colonne
annee_naissance_enfant_4
aura beaucoup de valeurs manquantes et prendra beaucoup de place pour peu d'informations.La même information peut se mettre en deux bases :
Faire la chasse aux informations redondantes
Le fait que la base tienne dans la RAM permet d'accélérer les calculs. Aussi il est souvent préférable de réduire la taille de la base même au prix de quelques calculs supplémentaires. Par exemple supposons qu'on ait une colonne
date_naissance
qui soit au formatDate
et que, très souvent, on ait besoin de l'année naissance ou du mois de naissance de l'individu. Créer les colonnesannee_naissance = year(dateNaissance)
etmois_naissance = month(dateNaissance)
peut être tentant mais bien souvent la perte de RAM associée à ces deux nouvelles colonnes sera plus dommageable que l'inconvénient de devoir à chaque fois réécrireyear(dateNaissance)
, quitte à demander 30 fois àR
de refaire ce petit calcul.