Obtener y filtrar archivos en el directorio<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo una secuencia de comandos JMP para solicitar al usuario un directorio y luego filtrar por tipos de archivos específicos dentro de ese directorio.Mi problema es que el proceso de filtrado a menudo lleva más tiempo que simplemente obtener los archivos.Si la cantidad de archivos es grande (>100 000 archivos), el tiempo total para recopilar y filtrar archivos puede ser de más de 30 minutos.¿Hay una manera más rápida o más eficiente de hacer esto?Estoy usando JMP11. ¡Gracias!
// Ejemplo.
Nombres predeterminados hasta aquí ( 1 );
dir = Seleccionar directorio ("Seleccione un directorio", "/C:/Archivos de programa/SAS/");
t1 = Marcar Segundos();
archivos = archivos en el directorio (dir, recursivo);
t2 = Marcar Segundos();
t_getfiles = t2 - t1;
n_getfiles = N elementos (archivos);
t3 = Marcar Segundos();
For( i = N Elementos( archivos ), i >= 1, i--,
If( !Termina con( archivos , ".jmp" ),
Eliminar de (archivos, i)
)
);
t4 = Marcar Segundos();
t_filtros = t4 - t3;
n_filterfiles = N elementos (archivos);
Mostrar (t_getfiles, n_getfiles, t_filterfiles, n_filterfiles);
Re: Obtener y filtrar archivos en el directorioGracias Craige, ¡eso funciona muy bien!
Re: Obtener y filtrar archivos en el directorioEl primer ejemplo es mucho más rápido en JMP 12 (velocidad similar al ejemplo de la tabla de datos); parece que todavía muestra algún comportamiento N^2 en JMP 11.
Re: Obtener y filtrar archivos en el directorioSí, vuelva a trabajar en el bucle de filtrado para eliminar el comportamiento N^2.JSL { enumera } elementos de acceso comenzando por el frente.Comenzaste en la parte posterior para evitar que los elementos eliminados estropearan la indexación.Eso conduce al comportamiento de tiempo en el peor de los casos para manipular la lista, caminando i elementos para llegar al i-ésimo elemento.Aquí hay una versión reelaborada que elimina el primer elemento de la lista de archivos, lo verifica y lo inserta como el primer elemento de la lista filtrada.
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_filtros = 975;
Unos 5 minutos.
Otra idea: puedes cargar una tabla de datos como esta:
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_filtros = 975;
Unos 5 segundos.Se requiere <