Das Skript initialisiert einen Datensatz ('HAVE') mit einer Zeichenvariablen ('ROW'), die eine lange Sequenz von Zahlen enthält, die durch vertikale Balken begrenzt sind. Anschließend werden zwei Ansätze vorgestellt: Der erste ('SPLIT') verwendet eine Schleife und die SCAN-Funktion, um diese Zeichenkette zu parsen, eine Methode, die als langsam gilt. Der zweite ('SPLIT2') zielt darauf ab, den 'Infile Trick' zu implementieren, indem der _INFILE_-Puffer mit dem Inhalt der 'ROW'-Variablen überladen wird, was ein schnelles und effizientes Lesen der begrenzten Elemente direkt in ein Variablenarray ermöglicht. Schließlich wird eine PROC COMPARE verwendet, um zu überprüfen, ob die Ergebnisse der beiden Methoden identisch sind, wodurch die erhöhte Leistung ohne Verlust der Datenintegrität validiert wird, vorausgesetzt, die Syntaxfehler in 'SPLIT2' werden korrigiert.
Datenanalyse
Type : INTERNE_ERSTELLUNG
Alle Daten werden intern durch den DATA-Schritt 'HAVE' generiert, der eine lange Zeichenvariable ('ROW') erstellt, die begrenzte Werte enthält. Es wird kein externer Datensatz als primäre Quelle verwendet.
1 Codeblock
DATA STEP Data
Erklärung : Dieser DATA-Step-Block erstellt einen Datensatz namens 'HAVE'. Er initialisiert eine Zeichenvariable 'ROW' mit 8000 Byte. Anschließend wird eine komplexe Zeichenkette konstruiert, indem 700 formatierte Zahlen (z3.) durch den Trennzeichen '|' verkettet werden. Dieser Vorgang wird 10.000 Mal wiederholt, um eine große Anzahl von Beobachtungen zu generieren, die einen umfangreichen zu verarbeitenden Datensatz simulieren.
Kopiert!
data HAVE;
length ROW $8000;
ROW='|||';
do I=1 to 700;
ROW=catx('|',ROW,put(i,z3.));
end;
do J = 1 to 1e4;
output;
end;
run;
1
DATA HAVE;
2
LENGTH ROW $8000;
3
ROW='|||';
4
DO I=1 to 700;
5
ROW=catx('|',ROW,put(i,z3.));
6
END;
7
DO J = 1 to 1e4;
8
OUTPUT;
9
END;
10
RUN;
2 Codeblock
DATA STEP
Erklärung : Dieser DATA-Schritt liest den Datensatz 'HAVE'. Er deklariert ein Array von 700 Zeichenvariablen ('VAR'). Anschließend wird eine Schleife verwendet, um über dieses Array zu iterieren und jedes Element der 'ROW'-Variablen sequenziell mithilfe der SCAN-Funktion zu extrahieren. Dieser Ansatz ist, obwohl funktionsfähig, für große Datenmengen oder eine große Anzahl zu scannender Elemente aufgrund seiner algorithmischen Komplexität O(N^2) notorisch langsam.
Kopiert!
data SPLIT; /* Slow */
set HAVE;
array VAR(700) $10;
do I = 1 to dim(VAR);
VAR[I]=scan(ROW,I,'|','m');
end;
run;
1
DATA SPLIT; /* Slow */
2
SET HAVE;
3
array VAR(700) $10;
4
DO I = 1 to dim(VAR);
5
VAR[I]=scan(ROW,I,'|','m');
6
END;
7
RUN;
3 Codeblock
DATA STEP
Erklärung : Dieser DATA-Schritt zielt darauf ab, den 'Infile Trick' für eine schnelle Extraktion der begrenzten Daten zu implementieren. Er liest den Datensatz 'HAVE'. Die INFILE-Anweisung ist so konfiguriert, dass sie eine virtuelle Datei mit dem Trennzeichen '|' und einer hohen Satzlänge liest. Die entscheidende Zeile `_infile_=ROW;` kopiert den Inhalt der 'ROW'-Variablen (aus dem Dataset 'HAVE') direkt in den Eingabepuffer des DATA-Schritts.
**HINWEIS ZUR SYNTAX:** Die folgenden `input`-Anweisungen enthalten Dateipfade (`@code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json` und `@code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json`), die syntaktisch falsch sind, um Variablen oder Spaltenzeiger in einem SAS DATA-Schritt anzugeben. Um ausführbar und funktionsfähig zu sein, war die wahrscheinliche Absicht, die begrenzten Werte direkt in ein Variablenarray zu lesen, z. B. `input (VAR1-VAR700) (:$10.);`. Wie geschrieben, wird dieser SAS-Block Syntaxfehler verursachen und nicht korrekt ausgeführt werden.
Kopiert!
data SPLIT2; /* Fast */
set HAVE;
infile sasautos(verify.sas) dsd dlm='|' lrecl=8000;
input @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json @;
_infile_=ROW;
input @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json (VAR1-VAR700) (:$10.) @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json;
run;
INPUT @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json @;
5
_infile_=ROW;
6
INPUT @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json (VAR1-VAR700) (:$10.) @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json;
7
RUN;
4 Codeblock
PROC COMPARE
Erklärung : Diese Prozedur vergleicht die Datensätze 'SPLIT' (mit der langsamen Methode erstellt) und 'SPLIT2' (Versuch, den 'Infile Trick' zu verwenden), um zu überprüfen, ob die beiden Methoden identische Ergebnisse liefern. Dies ermöglicht die Validierung der Genauigkeit der Optimierungstechnik trotz ihres unterschiedlichen Ansatzes. Aufgrund des Syntaxfehlers in 'SPLIT2' wird diese PROC COMPARE fehlschlagen oder Unterschiede melden, wenn 'SPLIT2' nicht korrekt aufgebaut werden kann.
Kopiert!
proc compare data=SPLIT compare=SPLIT2;
run;
1
PROC COMPAREDATA=SPLIT compare=SPLIT2;
2
RUN;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : SPDX-License-Identifier: Apache-2.0. Originalcode von ChrisNZ, Diskussion in den SAS Communities (https://communities.sas.com/t5/SAS-Programming/How-to-delimit-large-dataset-28-Million-rows-into-700-variables/m-p/487676).
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.