Skynet a un sérieux problème de performance. Ses drones de reconnaissance scannent en permanence les ruines de Los Angeles et envoient un flux continu de visages détectés. Pour chaque visage, Skynet doit vérifier dans sa base de données work.profils_recherches (qui contient des millions de lignes) s'il s'agit d'un chef de la résistance et quelle arme utiliser contre lui.
La méthode classique de SAS ? Trier les deux tables avec PROC SORTLa PROC SORT est une procédure SAS permettant de réorganiser les observations d'une table selon l'ordre croissant ou décroissant d'une ou plusieurs variables, tout en supprimant les doublons., puis faire un MERGE dans une étape DATA. Le problème, c'est que trier des millions de lignes prend du temps, et pendant ce temps-là, John Connor s'est déjà échappé.
Pour la certification SAS 9 Advanced, vous devez maîtriser la solution ultime pour les recherches ultra-rapides : l'Objet Hash. C'est une table de correspondance (un dictionnaire) qui est chargée entièrement dans la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. vive (RAM) de l'ordinateur. Le temps de recherche devient quasi instantané.
1. Qu'est-ce qu'un Objet Hash ?
Contrairement à une table SAS physique sur un disque dur, un objet Hash n'existe qu'en mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya., et uniquement pendant la durée d'exécution de votre étape DATA. Dès que le RUN; est passé, l'objet Hash s'évapore de la RAM.
Il fonctionne sur le principe des paires Clé/Valeur :
- La Clé (Key) : Ce que vous cherchez (ex: le
Nomdu rebelle). - La Donnée (Data) : Ce que vous voulez récupérer (ex: l'
Armerecommandée).
Préparons nos deux tables :
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data work.faiblesses;
length Nom_Cible $20 Arme_Recommandee $30;
infile datalines dlm=',';
input Nom_Cible $ Arme_Recommandee $;
datalines;
John Connor,Infiltration psychologique
Sarah Connor,Assaut frontal blindé
Kyle Reese,Embuscade furtive
;
run;
/* Flux de données en direct (Scans des drones) */
data work.scans_drones;
length Nom_Cible $20 Secteur $10;
infile datalines dlm=',';
input Nom_Cible $ Secteur $;
datalines;
Sarah Connor,Secteur_4
Civil_Inconnu,Secteur_4
John Connor,Secteur_7
;
run;
2. Le rituel d'invocation : DECLARE et N = 1
Créer un objet Hash demande une syntaxe très orientée "objet" (avec des points), qui tranche avec le code SAS habituel.
La règle absolue pour l'examen : Vous ne devez charger la table en mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. qu'une seule fois ! Si vous oubliez la condition if _N_ = 1, SAS rechargera la table entière dans la RAM pour chaque ligne lue par le drone. C'est le plantage assuré.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
set work.scans_drones;
/* 1. Déclarer la variable qui va accueillir la donnée Hashée */
/* VITALE : Si elle n'est pas dans le flux entrant, SAS doit connaître sa longueur */
length Arme_Recommandee $30;
/* 2. Le chargement (Uniquement au 1er passage !) */
if _N_ = 1 then do;
/* Déclaration de l'objet Hash nommé "Dict" */
declare hash Dict(dataset: "work.faiblesses");
/* Définition de la Clé */
Dict.defineKey('Nom_Cible');
/* Définition des Données à rapatrier */
Dict.defineData('Arme_Recommandee');
/* Fermeture du dictionnaire */
Dict.defineDone();
end;
Astuce Certification : Notez bien que les noms des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. dans defineKey et defineData doivent obligatoirement être mis entre guillemets.
3. La méthode FIND() : Tirer à vue
Maintenant que notre dictionnaire Dict est confortablement installé dans la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya. de Skynet, nous pouvons traiter le flux de données entrant.
Pour chaque ligne lue dans work.scans_drones, nous allons demander à l'objet Hash de chercher le Nom_Cible. Pour cela, on utilise la méthode .find().
2
3
4
5
6
7
8
9
10
11
12
13
rc = Dict.find();
/* 4. Gestion du résultat */
if rc = 0 then
Statut = "Cible prioritaire - Arme chargée";
else do;
Statut = "Cible non prioritaire";
Arme_Recommandee = "Laser standard";
end;
drop rc; /* On nettoie le code retour */
run;
Que signifie ce rc (Return Code) ? C'est le mécanisme de communication de l'objet Hash.
- Si
.find()trouve une correspondance exacte pour la clé, il copie silencieusement la valeur deArme_Recommandeedans votre étape DATA et renvoie0. - S'il ne trouve rien (comme pour "Civil_Inconnu"), il renvoie un nombre différent de zéro.
Il est donc impératif de toujours tester if rc = 0.
Le récap' pour l'examen 🎓
L'anatomie parfaite d'une recherche avec un Objet Hash tient en 5 étapes clés que vous devez savoir reconnaître au premier coup d'œil :
lengthde la variable de retour (très souvent testé à l'examen ! Si vous l'oubliez, la variable sera tronquée ou manquante).if _N_ = 1 then do;declare hash...+defineKey+defineData+defineDone();rc = objet.find();if rc = 0 ...
Conclusion
Skynet vient de faire un bond technologique majeur. Avec l'objet Hash, les tris chronophages sont de l'histoire ancienne. Les drones peuvent désormais identifier instantanément le profil de la cible et charger l'arme appropriée sans aucune latence temporelle.
Mais que se passe-t-il si Skynet souhaite non seulement lire ce dictionnaire, mais aussi le mettre à jour en direct ? Ajouter de nouvelles faiblesses, supprimer des entrées obsolètes, ou parcourir le dictionnaire de A à Z ? C'est ce que nous explorerons dans l'Article 14 avec les méthodes avancées des Objets Hash et l'utilisation des Hash Iterators.






