<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai un script JMP pour demander à l'utilisateur un répertoire, puis filtrer des types de fichiers spécifiques à partir de ce répertoire.Mon problème est que le processus de filtrage prend souvent plus de temps que la simple récupération des fichiers.Si le nombre de fichiers est important (> 100 000 fichiers), le temps total de collecte et de filtrage des fichiers peut être supérieur à 30 minutes.Existe-t-il un moyen plus rapide ou plus efficace de le faire ?J'utilise JMP11. Merci!
// Exemple.
Noms par défaut à ici( 1 );
dir = Pick Directory( "Sélectionner un répertoire", "/C:/Program Files/SAS/" );
t1 = Tick Secondes();
files = Files In Directory( dir, Recursive );
t2 = Tick Secondes();
t_getfiles = t2 - t1 ;
n_getfiles = N éléments( fichiers );
t3 = Tick Secondes();
For( i = N Items( files ), i >= 1, i--,
Si( !Se termine par( fichiers , ".jmp" ),
Supprimer de (fichiers, je)
)
);
t4 = Tick Secondes();
t_filterfiles = t4 - t3 ;
n_filterfiles = N éléments( fichiers );
Show( t_getfiles, n_getfiles, t_filterfiles, n_filterfiles );
Merci Craige, ça marche très bien !
Le premier exemple est beaucoup plus rapide dans JMP 12 (vitesse similaire à l'exemple de table de données) ; il semble toujours montrer un comportement N ^ 2 dans JMP 11.
Oui, retravailler la boucle de filtrage pour supprimer le comportement N^2.JSL { listes } éléments d'accès en commençant par le devant.Vous avez commencé à l'arrière pour éviter que les éléments supprimés ne perturbent l'indexation.Cela conduit à peu près au comportement temporel le plus défavorable pour la manipulation de la liste, en parcourant i éléments pour atteindre le ième élément.Voici une version retravaillée qui supprime l'élément le plus en avant de la liste des fichiers, le vérifie et l'insère en tant qu'élément le plus en avant de la liste filtrée.
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_fichiersfiltres = 975 ;
Environ 5 minutes.
Autre idée : vous pouvez charger une table de données comme celle-ci :
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_fichiersfiltres = 975 ;
Environ 5 secondes.Le champ <