<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho uno script JMP per richiedere all'utente una directory e quindi filtrare per tipi di file specifici all'interno di quella directory.Il mio problema è che il processo di filtraggio richiede spesso più tempo del semplice recupero dei file.Se il numero di file è elevato (>100.000 file), il tempo totale per raccogliere e filtrare i file può essere superiore a 30 minuti.C'è un modo più veloce o più efficiente per farlo?Sto usando JMP11. Grazie!
// Esempio.
Nomi Predefinito A Qui( 1 );
dir = Seleziona directory( "Seleziona una directory", "/C:/Programmi/SAS/" );
t1 = Tick Secondi();
files = Files In Directory( dir, Ricorsivo );
t2 = Tick Secondi();
t_getfiles = t2 - t1;
n_getfiles = N elementi (file);
t3 = Tick Secondi();
For( i = N Elementi( files ), i >= 1, i--,
If( !Ends With( files , ".jmp" ),
Rimuovi da (file, i)
)
);
t4 = Tick Secondi();
t_filterfiles = t4 - t3;
n_filterfiles = N elementi (file);
Mostra( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
Grazie Craige, funziona alla grande!
Il primo esempio è molto più veloce in JMP 12 (velocità simile all'esempio della tabella dati); sembra che mostri ancora un comportamento N^2 in JMP 11.
Sì, rielabora il ciclo di filtraggio per rimuovere il comportamento N^2.JSL {elenchi} accedono agli elementi iniziando dalla parte anteriore.Hai iniziato dal retro per evitare che gli elementi eliminati rovinino l'indicizzazione.Ciò porta praticamente al comportamento temporale del caso peggiore per manipolare l'elenco, percorrendo i elementi per raggiungere l'elemento i-esimo.Ecco una versione rielaborata che rimuove l'elemento in primo piano dall'elenco dei file, lo controlla e lo inserisce come elemento in primo piano dell'elenco filtrato.
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_getfile = 171630;
t_filterfiles = 258,5;
n_filterfiles = 975;
Circa 5 minuti.
Un'altra idea: puoi caricare una tabella di dati come questa:
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_getfile = 171635;
t_filterfiles = 0.716666666666697;
n_filterfiles = 975;
Circa 5 secondi.Il <