Datasets im Hauptspeicher

Hallo Forum,

Gib es eine Möglichkeit (kleine) Datasets explizit im Hauptspeicher zu belassen? Jede SAS Dataset ist ja eine Datei auf der Platte und wird ja vom Betriebssystem entsprechend behandelt inklusive allem Overhead. Kann man das irgendwie vermeinden, wohl wissend, daß die Daten nur temporärer Natur sind?

Danke und Gruß

_ULeh

VIO?

Ich habe gerade ein äquivalentes Problem mit einem Flatfile statt einem SAS-Dataset, und habe in z/OS-Dokumentationen die Speicherart "VIO" (Virtual I/O) gefunden. Den kann man wohl auch für SAS-Libraries verwenden, man muss offenbar nur eine Library definieren mit der Option UNIX=VIO, und dann wird ein temporäres File im RAM dafür verwendet:

libname abc unit=vio;
Unklar ist mir bisher, wie man dabei die Größe angibt...

Um temporäre Flatfiles im RAM zu halten, muss man wohl stattdessen einen DD-Namen in der JCL definieren:

//tempo dd unit=vio,dsorg=ps,recfm=...,space=...,lrecl=...

Vielleicht geht aber sogar

filename abc unit=vio;

Hat irgend jemand schon einmal VIOs für Flatfiles oder SAS-Libraries verwendet?

Was es auch noch gibt, ist die RAMDisk

... nur der Vollständigkeit halber: Eine Option, die es unter Windows auch noch gibt, ist die RAMDisk - allerdings mit max. 32 MB.

Eine gute Beschreibung gibt's in diesem Artikel.

Gruß SF

Libname mit MEMLIB-Option

Hallo _ULeh!

Das Angestrebte lässt sich mit dem LIBNAME-Statement und der MEMLIB-Option realisieren. Sieht als Programm so aus:

libname InMemory 'C:\TEMP\memlib' memlib;
data InMemory.class;
   
set sashelp.class (where=(sex='F'));
run;
data work.class;
   
set InMemory.class;
run;

Der Pfad muss exixtieren auch wenn nichts ins Filesystem geschrieben wird.
Sinnvollerweise könnte man hier auch den Pfad des Workverzeichnisses auslesen:

%let pfad=%sysfunc (pathname(WORK));
%put &Pfad;
libname InMemory "&Pfad" memlib;
Gruß
Klaus Landwich

MEMLIB-Option aber nur mit Windwos

Hallo,
leider gibt es diese schöne MEMLIB-Option nur mit Windows, schade.
Der Aufruf aus dem obigen Beitrag (KlausLandwich, 4. April 2007, 07:54) geht übrigends noch einfacher und m.E. eleganter:

libname InMemory "." memlib;
Der Name . ist ein jederzeit gültiger Pfad und steht für "das derzeitige Verzeichnis".
Der Name . für das working directory gilt in allen UNIXen und auch in Windows gültig (wie war der Spruch: "Win98 ist UNIX68" oder so).
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Ja, leider nur für Windows

Hallo Herr Kneilmann!

Leider gibt es die MEMLIB-Option nur unter WINDOWS. Unter z/OS gibt es die HIPERSPACE-Option, die genau das Gleiche tut.

Für UNIX hab ich leider keine Entsprechung finden können.

Gruß
Klaus Landwich

Ja, 'SAS-Dateien in den Hauptspeicher laden' geht ...

... und zwar mit dem SASFILE-Statement.

Beispiel:

sasfile sasuser.myds open;
proc freq data=sasuser.myds;
   
tables what ever;
run;
sasfile sasuser.myds close;

Details gibt's hier: SASFILE Statement (SAS Online Doc).

Gruß SF

Ganz so einfach ist es (wiedermal) nicht

Der sasfile Befehl ist bekannt. Dieser geht aber von einer existierenden Datei aus. Das heißt, es wird wieder das Dateisystem bemüht. Genau das sollte nicht der Fall sein. Gesucht ist eine Lösung, die das Dateisystem gar nicht berührt, weder beim Erstellen noch Nutzen der SAS-Dataset (was z.B. im Falle eines Netzlaufwerks sehr sinnvoll ist).

Gruß _ULeh

?!?

Wo bekommen Sie denn die Daten für dieses "virtuelle" Dataset her? An irgendeiner Stelle müssen Sie doch das Dateisystem bemühen.
Spontan fällt mir jetzt nur ein Hashobjekt ein. Z.B. lesen Sie eine lokale Datei in ein View und diese dann in ein Hashobjekt, aber auch da wird zumindest das Dateisystem bemüht, bis das ganze im Hauptspeicher ist.

filename in 'pfad/infile.csv';
data out/view=out;
  
infile in dlm=';' firstobs=2;
  
input key  $;
run;

data test;
   
if _n_ = 1 then do;
      
declare hash h(dataset: "out", hashexp: 10);
      h.defineKey(
'key');
      h.defineDone();
   
end;
   
set lookup(keep=key data1 data2 data3);
   rc = h.find();
   
if (rc = 0) then output;
run;

Hier wird die Datei infile mehr oder weniger direkt in den Speicher geladen.
Details dazu finden sich hier

Vielleicht gibt es ja noch eine virtuelle Library, die im Hauptspeicher allokiert ist?

Gruß
Wolfgang Hornung

Wunschbeispiel

Schön wäre es, wenn folgendes möglich ist:

data datasetInMem1;
  
set dataOnDisc(where=blahblah);
  
...
run;
/*********** ab hier keine Dateisystemnutzung *****************/
data datasetInMem2;
  
set datasetInMem1;
  
...
run;
proc irgendwas data=datasetInMem2(where=wasauchimmer);
   
...
run;
...
%delTable(tables=datasetInMem1 datasetInMem2);
/******* wieder mögliche Dateisystemnutzung ab hier **************/
...
Klar wird am Anfang der Dateisystem bemüht, aber dann sollte das nicht mehr passieren. Vorschläge?

Mit freundlichen Grüßen

_ULeh

Aha

jetzt hab ich es verstanden, mein Kommentar von eben war etwas zu voreilig.
Sie wollen eine Datei, bzw. einen Teil davon in den Speicher lesen, und ab diesem Zeitpunkt soll sich alles im Speicher abspielen.
Sorry für das Missverständnis.

Gruß
WH

SASFILE

wenn Sie sich gleich das erste Beispiel zum SASFILE Statement (s.o. Beitrag von Stephan Frenzel) mal anschauen, dann liefert dieses Statement genau das, was sie gerne hätten. Das OPEN Argument opens the file, allocates the buffers, but defers reading the data into memory until a procedure, statement, or application is executed. Bei jeder weiteren "Benutzung" wird das File aus dem Speicher gelesen.
Das ist doch eigentlich genau das, was Sie möchten, oder?
Das LOAD Argument opens the file, allocates the buffers, and reads the data into memory.

Gruß
Wolfgang Hornung

Schreiben von datasets

Hallo Forum,

Leider kann ich mit dem sasfile-Statement nur SAS Datasets lesen. So ergibt

proc transpose data=data1 out=data1;
  
var ...;
  
by ...;
run;
den Fehler
ERROR: Data set DATA1 cannot be opened in OUTPUT mode because it is already open through a SASFILE statement.
Gibt es dafür eine Lösung?

Gruß _ULeh