J'ai une courte question - si nous créons un jeu de données SAS Say - Sample.sas7bdat, qui existe déjà, le code prendra plus de temps pour exécuter (car le code doit remplacer le jeu de données existant) que le cas Dataset n'était pas déjà là? J'ai fait des recherches sur Internet mais que je n'ai pas trouvé de réponse satisfaisante. Pour moi, il semble que le code devait prendre un peu de temps supplémentaire, bien que cela ne soit pas sûr de la quantité d'impact qu'il ferait sur un jeu de données de 10 Go. P> P>
3 Réponses :
Dans un bref test, mon jeu de données de 800 Mo a pris 4 secondes pour créer de nouvelles et 10-15 secondes pour écraser. Je suppose que cela est parce que SAS doit conserver le jeu de données existant jusqu'à ce que le DataStep achève l'exécution de manière à préserver l'intégrité des données. C'est pourquoi vous pourriez obtenir le message suivant dans le journal:
NOTE: The data set WORK.SAMPLE1 has 100000000 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 3.94 seconds user cpu time 3.14 seconds system cpu time 0.80 seconds memory 1482.18k OS Memory 26268.00k Timestamp 08/12/2014 11:43:10 AM Step Count 43 Switch Count 38 Page Faults 0 Page Reclaims 112 Page Swaps 0 Voluntary Context Switches 99 Involuntary Context Switches 294 Block Input Operations 0 Block Output Operations 1587464
Ce test est quelque peu imparfait comme je vais expliquer ma réponse; Testez un seul remplacement entraînera une différence de vitesse apparente dramatique due à la mise en cache en écriture.
Merci cela aussi bien!
J'ai répété le test un certain nombre de fois
Il y a plus d'opérations de fichiers impliquées lorsque vous écrasez. Après avoir créé la table, SAS supprimera l'ancienne table et renommera le nouveau. Dans mes tests, cela a pris 0,2 seconde heure de plus. P>
Je me demande simplement quelles sont les autres opérations de fichiers supplémentaires en cas d'écrasement.
Supprimer et renommer ne devrait pas être (très) dépendant de la taille du fichier, ils sont principalement des opérations de pointeur de système de fichiers (aucun contenu réel du fichier n'est déplacé). C'est un peu dépendant du système d'exploitation.
Vous pouvez le tester avec vous-même assez facilement. Quelques réserves:
Voici un exemple de mon test. Il s'agit d'un jeu de données de 100 millions de lignes avec deux numériques de 8 octets, donc 1,6 Go. P>
Premièrement, les résultats. Je vois une deuxième différence. Pourquoi? SAS prend quelques opérations lors du remplacement d'un jeu de données: P>
%macro test_me(iter=1); %do _i=1 %to &iter.; %let start = %sysfunc(time()); data test&_i.; do x = 1 to 1e8; y=x**2; output; end; run; %let mid=%sysfunc(time()); data test&_i.; do x = 1 to 1e8; y=x**2; output; end; run; %let end=%sysfunc(time()); %let _new = %sysevalf(&mid.-&start.); %let _rep = %sysevalf(&end.-&mid.); %put Iteration &_i. &=_new. &=_rep.; %end; proc datasets nolist kill; quit; %mend test_me; options nosource nonotes nomprint nosymbolgen; %test_me(iter=5);
Merci de partager cela !! Alors, il est donc sûr de dire que le temps supplémentaire consiste à copier l'ensemble de données du dossier "TEMP (répertoire de travail dans UNIX)" de la bibliothèque principale?
Cela ne devrait pas réellement déplacer un fichier. Il devrait changer un pointeur de système de fichiers, principalement. Je ne sais pas pourquoi c'est une deuxième ou deux ou trois; Cela me semble long, d'où je soupçonne quelque chose de drôle avec la mise en cache en écriture. Il ne suffit certainement pas assez longtemps pour écrire l'ensemble du jeu de données deux fois.
Pourriez-vous mettre à jour votre question avec des informations sur le système d'exploitation et quelle version SAS utilisez-vous?