<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />ユーザーにディレクトリの入力を求め、そのディレクトリ内から特定のファイル タイプをフィルタリングする JMP スクリプトがあります。私の問題は、フィルタリングのプロセスには、ファイルを取得するだけよりも時間がかかることが多いことです。ファイルの数が多い場合 (ファイル数が 100,000 以上)、ファイルの収集とフィルタリングにかかる合計時間が 30 分を超える場合があります。これをより速く、より効率的に行う方法はありますか?JMP11を使用しています。ありがとう!
// 例。
名前のデフォルトは Here( 1 );
dir = Pick Directory( "ディレクトリを選択", "/C:/Program Files/SAS/" );
t1 = ティック秒();
files = ディレクトリ内のファイル( dir, 再帰 );
t2 = ティック秒();
t_getfiles = t2 - t1;
n_getfiles = N Items( files );
t3 = ティック秒();
For( i = N Items( files )、i >= 1、i--、
If( !Ends With( ファイル、「.jmp」)、
Remove From( files, i )
)
);
t4 = ティック秒();
t_filterfiles = t4 - t3;
n_filterfiles = N Items( files );
Show( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
最初の例は、JMP 12 でははるかに高速です (データ テーブルの例と同様の速度)。 JMP 11 ではまだ N^2 の動作が発生しているようです。
はい、フィルタリング ループを再作成して、N^2 の動作を削除します。JSL { list } は先頭から開始して要素にアクセスします。削除された要素によってインデックス作成が台無しになるのを防ぐために、最後から開始しました。これにより、リスト操作では、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秒くらい。<