<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />사용자에게 디렉터리를 묻는 메시지를 표시한 다음 해당 디렉터리 내에서 특정 파일 유형을 필터링하는 JMP 스크립트가 있습니다.내 문제는 필터링 프로세스가 종종 파일을 가져오는 것보다 더 오래 걸린다는 것입니다.파일 수가 많은 경우(>100,000개 파일) 파일을 수집하고 필터링하는 총 시간은 30분 이상이 될 수 있습니다.이를 수행하는 더 빠르고 효율적인 방법이 있습니까?JMP11을 사용하고 있습니다. 감사해요!
// 예.
여기에 기본 이름( 1 );
dir = 디렉토리 선택( "디렉토리 선택", "/C:/Program Files/SAS/" );
t1 = 틱 초();
파일 = 디렉토리에 있는 파일( dir, 재귀 );
t2 = 틱 초();
t_getfiles = t2 - t1;
n_getfiles = N 항목( 파일 );
t3 = 틱 초();
For( i = N 항목( 파일 ), i >= 1, i--,
If( !Ends With( 파일 , ".jmp" ),
제거 위치( 파일, i )
)
);
t4 = 틱 초();
t_filterfiles = t4 - t3;
n_filterfiles = N 항목( 파일 );
표시( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
첫 번째 예는 JMP 12에서 훨씬 더 빠릅니다(데이터 테이블 예와 비슷한 속도). JMP 11에서 일부 N^2 동작이 여전히 표시되는 것 같습니다.
예, 필터링 루프를 재작업하여 N^2 동작을 제거합니다.JSL { 목록 }은 맨 앞에서 시작하여 요소에 액세스합니다.삭제된 요소가 인덱싱을 망치지 않도록 뒤에서 시작했습니다.이는 목록을 조작하는 최악의 시간 동작으로 이어지며, i번째 요소에 도달하기 위해 i번째 요소를 이동합니다.다음은 파일 목록에서 맨 앞 요소를 제거하고 확인하고 필터링된 목록의 맨 앞 요소로 삽입하는 재작업 버전입니다.
dir = "c:\";
t1 = Tick Seconds();
files = Files In Directory( dir, Recursive );
t2 = Tick Seconds();
t_getfiles = t2 - t1;
n_getfiles = N Items( files );
filteredFiles = {};
t3 = Tick Seconds();
while( (testname = Remove From( files, 1 )) != {},
If( Ends With( testname[1], ".jmp" ),
insertinto(filteredFiles,testname,1);
)
);
t4 = Tick Seconds();
t_filterfiles = t4 - t3;
n_filterfiles = N Items( filteredFiles );
Show( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
t_getfiles = 4.0333333333333;
n_getfiles = 171630;
t_filterfiles = 258.5;
n_filterfiles = 975;
약 5분.
또 다른 아이디어: 다음과 같이 데이터 테이블을 로드할 수 있습니다.
dir = "c:\";
t1 = Tick Seconds();
files = Files In Directory( dir, Recursive );
t2 = Tick Seconds();
t_getfiles = t2 - t1;
n_getfiles = N Items( files );
t3 = tickseconds();
dt = New Table( "directory",
Add Rows( 0 ),
New Column( "filename", Character, Nominal, Set Values( files ) ),
New Column( "isTable",
Numeric,
Continuous,
Format( "Best", 12 ),
Formula( Ends With( :filename, ".jmp" ) )
)
);
dt<
dt<
dtFiltered = dt<
t4=tickseconds();
t_filterfiles = t4 - t3;
n_filterfiles = N rows( dtFiltered );
Show( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
t_getfiles = 4.01666666666642;
n_getfiles = 171635;
t_filterfiles = 0.716666666666697;
n_filterfiles = 975;
약 5초.<