Quando esporto un set di dati in formato Stata utilizzando PROC EXPORT
, SAS 9.4 si espande automaticamente aggiunge un byte aggiuntivo (vuoto) a ogni osservazione di ogni variabile stringa. Ad esempio, in questo insieme di dati:Come posso impedire a SAS di aggiungere un byte vuoto extra a ogni variabile stringa quando utilizzo PROC EXPORT?
data test1;
input cust_id $ 1
month 3-8
category $ 10-12
status $ 14-14
;
datalines;
A 200003 ABC C
A 200004 DEF C
A 200006 XYZ 3
B 199910 ASD X
B 199912 ASD C
;
quit;
proc export data = test1
file = "test1.dta"
dbms = stata replace;
quit;
variabili cust_id
, category
e status
dovrebbe essere str1
, str3
, e str1
nel file finale Stata, e quindi occupano 1 byte, 3 byte, ed 1 byte , rispettivamente, per ogni osservazione. Tuttavia, SAS aggiunge automaticamente un byte extra vuoto a ciascuna osservazione, che espande i loro tipi di dati al tipo di dati str2
, str4
e str2
nel file Stata emesso.
questo è estremamente problematico perché è un byte extra aggiunto al ogni osservazione di tutte le variabili stringa. Per dataset di grandi dimensioni (ne ho alcuni con ~ 530 milioni di osservazioni e numerose variabili stringa), questo può aggiungere diversi gigabyte al file esportato.
Una volta che il file viene caricato in Stata, il comando compress
in Stata può rimuovere automaticamente questi byte vuoti e compattare il file, ma per i grandi insiemi di dati, PROC EXPORT
aggiunge così tanti byte in più al file che non sempre hanno abbastanza memoria per caricare il set di dati in Stata in primo luogo.
C'è un modo per impedire a SAS di riempire le variabili stringa in primo luogo? Quando esporto un file con una variabile di stringa di un carattere (ad esempio), desidero che tale variabile venga memorizzata come variabile di stringa di un carattere nel file di output.
Sospetto che SAS stia aggiungendo un terminatore di stringa, anche se non ne ho idea. – Joe
Guardando la documentazione Stata, supporta il terminatore di stringa '\ 0' (per l'operazione di tipo" Varchar "). Sospetto che SAS lo metta appena dopo * ogni * stringa, se dovessi indovinare.Suggerirei di inserire un ticket di supporto con il supporto tecnico SAS; possono probabilmente a) confermare questo e b) farti sapere se c'è una soluzione alternativa. Non ne vedo uno basato su un breve sguardo. – Joe
E se si riceve risposta dal supporto tecnico SAS, si prega di aggiungere una risposta con qualsiasi informazione si ottenga, quindi è disponibile per altri utenti! – Joe