2017-11-12 1 views
2

MSTORE 기능을 사용하여 컴파일하려는 여러 자동 실행 라이브러리에서 수백 개의 매크로가 있습니다. 다음은 MSTORED 옵션을 사용을 요구이기 때문에 우리는 모든 정의에 /STORE를 추가하지 않으 -autocall 라이브러리를 저장된 컴파일 된 매크로로 변환

문제는 이러한 라이브러리 중 일부는 다른 사이트에서 사용되는 것입니다.

답변은 모든 %macro 문 끝에 /* /STORE */ 문을 추가하여 모든 재배포시 .sas 프로그램 파일을 정규식 (또는 다른 텍스트 대체 기술)로 업데이트 할 수 있다고 생각합니다. 지저분한 해결 방법.

일반 (수정되지 않은) 자동 호출 매크로를 컴파일하고 저장할 수 있습니까? 예 : 각각 %inc에 의해 작업 매크로 카탈로그를 저장하거나 그런 식으로 저장 하시겠습니까?

+0

이 작업에 대한 동기는 무엇입니까? 매크로를 컴파일하는 오버 헤드는 대개 작습니다. – user667489

+0

이것은 성능이며, 프로세스 내에서'dosubl'과'run_macro'를 사용하기 때문에 여러 번 재 컴파일 될 것으로 생각되는 큰 매크로 때문에 발생합니다. 43 초 (평균) 세션으로 약 1.5 초에서 2 초 정도의 시간을 절약합니다. –

+0

나는 고쳐서 결국 시간을 절약 할 수 있었다. 아마도'run_macro'의 사전 사용 이었지만, 지금은'dosubl'을 사용하는 경향이 있습니다 (실제로 지난 번 측정했을 때 더 큰 영향이있었습니다). –

답변

3

나는 이것이 가능하지 않다는 것을 명확히 말하지는 않겠지 만, 나는 이전에 똑같은 일을 시도하고 같은 지점에 달라 붙었다 고보고 할 수 있습니다. 나는 또한 모든 %macro 성명에 /store을 추가하는 것 이외의 다른 방법을 찾지 못했습니다.

동일한 시스템에서 (처음 몇 개의 자동 호출 매크로를 컴파일 한 후) 다른 세션에서 work.sasmacr 카탈로그를 업로드 할 수 있었음을 막연하게 기억하지만 다른 세션은 저장된 컴파일 된 매크로를 사용하기위한 적절한 옵션이 설정되었지만 전송 된 카탈로그.

내 동기가 다른 경우 - 한 세션에서 매크로를 정의하고 두 세션에서 자동 호출 폴더 또는 %including에 저장하지 않고 다른 매크로에서 매크로를 정의하는 방법을 찾고있었습니다. 그러나 결론은 동일했습니다.

+0

불행히도, 나는 당신의 직감이 정확하고 불가능하다고 생각합니다. –

2

여기 컴파일을 위해 취한 접근 방식이 있습니다 (물론 많은 대체 방법이 있습니다). 쿼리에 대한 사항에서 추출 할 수 있습니다 다음과 같은 접근 방식은 매크로에 의존

%put %sysfunc(getoption(sasautos)); 

)/*/STORE SOURCE*/;으로 폐쇄되는 :

%macro some_macro(var1=x, var2=y 
)/*/STORE SOURCE*/; 

는 SAS 코드가 프로그램이어야한다, 당신은 할 수 없습니다 매크로에서 저장된 컴파일 된 매크로를 만듭니다.

/* set mstore options */ 
options mstored sasmstore=yourlib; 

/* get list of macros */ 
/* taken from macrocore library */ 
/*https://github.com/macropeople/macrocore/blob/master/base/mp_dirlist.sas*/ 
%mp_dirlist(path=/location/one,outds=in1) 
%mp_dirlist(path=/location/two,outds=in2) 

/* set up a temporary fileref */ 
filename tmp temp; 

/** 
* write each source macro to the fileref 
* and switch on the STORE option 
*/ 
data want; 
    set in1 in2; 
    infile dummy filevar=filepath end=last ; 
    file tmp; 
    do until(last); 
    file tmp; 
    input; 
    if _infile_=')/*/STORE SOURCE*/;' then put ')/STORE SOURCE;'; 
    else put _infile_; 
    end; 
run; 

%inc tmp; /* compile macros */ 
filename tmp clear; /* clear ref */ 
2

무엇이 문제입니까?

먼저 모든 자동 호출 매크로를 컴파일하십시오. 소스 코드가있는 디렉토리를 가리키는 MYMACS라는 파일 참조가 있다고 가정 해보십시오.

%include mymacs(macro1,macro2,.....); 

% include 문 생성을 자동화 할 수 있도록 프로그램을 사용하여 모든 소스 파일을 검색 할 수 있습니다. 또는 데이터 저장을 사용하여 모든 소스 파일을 하나의 임시 파일로 복사하고이를 포함 할 수 있습니다.

filename src temp; 
data _null_; 
    infile "&inpath\*.sas" ; 
    file src ; 
    input; 
    put _infile_; 
run; 
%inc src ; 

그런 다음 WORK 카탈로그를 새 위치로 복사하십시오. 응용 프로그램 서버에서 SAS를 실행하는 경우 이름이 다릅니다. 이 경우 WORK.SASMACR 대신 WORK.SASMAC1에서 복사 해보십시오.

libname out base "&path"; 
proc catalog cat=work.sasmacr et=macro ; 
    copy out=out.sasmacr ; 
    run; 
quit; 

는 현재 작업 매크로 카탈로그를 해제하여 일 경우 SAS가 매크로를 발견하고, 컴파일 된 매크로의 새 카탈로그를 가리 키도록 옵션을 설정하지 않습니다 알 수 있도록 당신은, 테스트 할 수 있습니다.

proc catalog cat=work.sasmacr kill force ; 
quit; 
options mrecall mstored sasmstore=out ; 

그런 다음 복사 된 매크로 중 하나를 실행하려고합니다.

이제 새 세션을 시작하고 해당 세션에서 컴파일 된 매크로를 사용해보십시오.

+0

알려진/문서화되지 않은 문제가 있는지 확실하지 않았기 때문에 실제로 시도하지 않았습니다. 내 프로세스가 지금 구축되었지만 문제가 다시 발생하면이 접근법에 균열이 생길 것입니다 .. –

+0

fyi,'mrecall' 옵션이 불필요합니다 –

+0

'mrecall'은 매크로를 호출하려고 시도했을 때 유용합니다. 매크로를 찾지 못했습니다. 'autocall' 라이브러리에서는 적어도 컴파일 된 매크로가 중요한지 확실하지 않습니다. – Tom

관련 문제