J'ai plusieurs dossiers et dans chaque dossier se trouvent plusieurs fichiers CSV. Chaque fichier CSV comporte environ 500 000 lignes. J'utilise un script JSL pour concaténer tous les fichiers csv de chaque dossier dans une seule table JMP. Ce processus est répété sur chaque dossier et il y a donc au final autant de tables JMP concaténées que de dossiers. Mais cela prend beaucoup de temps.
J'ai recherché la programmation parallèle en JSL et j'ai découvert Parallel Assign. J'ai besoin de conseils sur la façon de placer le script ci-dessous dans Parallel Assign pour accélérer la concaténation. Je l'apprécierai grandement.
path = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
Print(dirList(path));
folderlist={};
folderlist = dirList(path);
count=nitems(folderlist);
//prefolderlist = Files In Directory( path );
//filepath = Convert File Path(path, Windows )
For( j2 = 1, count >= j2, j2++,
folderpath= path || folderlist[j2] || "/" ;
Print(folderpath);
prefilelist = Files In Directory( folderpath );
n2=nitems(prefilelist);
filelist = {};
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( 2, prefilelist[i2], "." ) == "txt" | Item( 2, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
nf=nitems(filelist); //number of items in the working list
cctable= New Table( "Combined data table ");//make an empty table
cctable<<New Column( "Source", Character, Nominal );
For( iii = 1 , iii <= nf, iii++, //this starts the first loop
filenow = ( filelist[iii] );
fileopen=(folderpath||filenow);
//dt=open(fileopen,private);
dt=open(fileopen,importset,private);//Import settings used in the open argument
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//dt<<new column("Source", character, nominal)<<set each value(9999);
dt << Run Formulas();
//add the current table to the bottom of the combined data table
cctable << Concatenate( Data Table( dt ), Append to first table );
//don't use "Create Source Column" argument
Close( dt, NoSave );//after concatenating the table, close it and move on
);//end of the first for loop
);Merci beaucoup. J'ai pu intégrer Importer plusieurs fichiers dans mon script et il est désormais capable de concaténer des tables beaucoup plus rapidement.
Jetez un œil à Fichier-> MultipleFileImport. Il peut parcourir des répertoires imbriqués, sélectionner par modèles de nom de fichier et concaténer des fichiers similaires. Et c'est plus rapide que d'utiliser open() sur un CSV, généralement même pour un seul fichier. Il crée également un script que vous pouvez modifier et réutiliser. Il peut ajouter une colonne avec des informations sur le fichier source.
Commencez de manière interactive, recherchez la case à cocher pour garder la fenêtre ouverte, faites quelques expériences.
L'interface graphique dispose de quatre filtres qui choisissent les fichiers sélectionnés.Le filtre dossier/caché/récursif est toujours visible et il y a trois cases à cocher pour afficher et activer les filtres de nom de fichier, d’heure de fichier et de taille de fichier. La liste des fichiers montre ce qui est sélectionné ; c'est pas pour sélectionner des fichiers.
Dans le pire des cas, vous pouvez utiliser MFI sur chaque répertoire, un à la fois, et probablement obtenir une belle accélération. Dans le meilleur des cas, il pourrait faire ce que vous voulez sur l'ensemble du nid de répertoires.
Parallel Assign est conçu pour remplir un tableau ET pour exécuter le JSL qui remplit chaque élément du tableau dans un environnement isolé qui évite les erreurs entre les threads. Il essaie d'éviter des choses comme accéder à une table de données en même temps à partir de deux threads différents. Si vous trouvez un moyen d'y parvenir, il plantera probablement.