8
votes

Écraserait-il que le jeu de données SAS existant prendrait plus de temps?

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à? XXX

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.

sas

1 commentaires

Pourriez-vous mettre à jour votre question avec des informations sur le système d'exploitation et quelle version SAS utilisez-vous?


3 Réponses :


1
votes

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


3 commentaires

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



3
votes

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.


2 commentaires

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.



5
votes

Vous pouvez le tester avec vous-même assez facilement. Quelques réserves:

  • Assurez-vous de disposer d'un ensemble de données suffisamment grand de telle sorte que vous ne manquez pas les différences dans une activité de processeur aléatoire simple. 100 + Mo est généralement une bonne cible. LI>
  • Assurez-vous d'effectuer le test plusieurs fois - plus il est préférable, sans temps entre les deux si possible. Un test sera toujours insuffisant et aura toujours tendance à montrer le premier jeu de données comme plus rapide, car il bénéficie d'une mise en cache en écriture (fondamentalement, le système d'exploitation indique qu'il est fait d'écrire quand ce n'est pas le cas, mais il suffit simplement de faire la queue en file d'attente en mémoire). li> ul>

    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);
    


2 commentaires

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.