Ho diverse cartelle e all'interno di ciascuna cartella ci sono diversi file CSV. Ogni file CSV ha circa 500.000 righe. Utilizzo uno script JSL per concatenare tutti i file CSV all'interno di ciascuna cartella in un'unica tabella JMP. Questo processo viene ripetuto su ogni cartella e quindi alla fine ci sono tante tabelle JMP concatenate quante sono le cartelle. Ma ci vuole molto tempo.
Ho cercato la programmazione parallela in JSL e sono venuto a conoscenza di Parallel Assign. Ho bisogno di alcune indicazioni su come inserire lo script seguente all'interno di Parallel Assign per accelerare la concatenazione. Lo apprezzerò molto.
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
);Grazie mille. Sono riuscito a incorporare Importa più file nel mio script e ora è in grado di concatenare le tabelle molto più velocemente.
Dai un'occhiata a File-> MultipleFileImport. Può esplorare directory nidificate, selezionare modelli di nomi di file e concatenare file simili. Ed è più veloce rispetto all'utilizzo di open() su un CSV, solitamente anche per un singolo file. Crea anche uno script che puoi modificare e riutilizzare. Può aggiungere una colonna con informazioni sul file sorgente.
Inizia in modo interattivo, cerca la casella di controllo per mantenere la finestra aperta, fai un paio di esperimenti.
La GUI ha quattro filtri che scelgono i file selezionati.Il filtro cartella/nascosto/ricorsivo è sempre visibile e ci sono tre caselle di controllo da mostrare e abilitare i filtri nome file, ora file e dimensione file. L'elenco dei file mostra ciò che è selezionato; è non per selezionare i file.
Nel peggiore dei casi, puoi utilizzare MFI su ciascuna directory, una alla volta, e probabilmente ottenere una buona velocità. Nel migliore dei casi potrebbe fare quello che vuoi sull'intero nido di directory.
Parallel Assign è progettato per riempire un array E per eseguire il JSL che riempie ogni elemento dell'array in un ambiente isolato che previene errori tra i thread. Cerca di evitare cose come l'accesso simultaneo a una tabella dati da due thread diversi. Se trovi un modo per farlo, probabilmente andrà in crash.