私はいくつかのフォルダーを持っており、各フォルダー内にはいくつかのCSVファイルがあります。 各CSVファイルには約500,000行があります。 JSLスクリプトを使用して、各フォルダー内のすべてのcsvファイルを1つのJMPテーブルに連結します。 このプロセスは各フォルダーで繰り返されるため、最終的にはフォルダーの数と同じ数の連結されたJMPテーブルが存在します。 しかし、それは多くの時間がかかります。
JSLで並列プログラミングを検索し、ParallelAssignについて知りました。 連結を高速化するために、以下のスクリプトをParallelAssign内に配置する方法についてのガイダンスが必要です。 よろしくお願いします。
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
);File-> MultipleFileImportを見てください。 ネストされたディレクトリを掘り下げ、ファイル名のパターンで選択し、同様のファイルを連結することができます。 また、通常は単一のファイルであっても、CSVでopen()を使用するよりも高速です。 また、変更して再利用できるスクリプトも作成します。 ソースファイル情報を含む列を追加できます。
インタラクティブに開始し、ウィンドウを開いたままにするチェックボックスを探し、いくつかの実験を行います。
GUIには、選択したファイルを選択する4つのフィルターがあります。フォルダー/非表示/再帰フィルターは常に表示され、表示する3つのチェックボックスと有効にするファイル名、ファイル時間、およびファイルサイズのフィルター。 ファイルリストには、何が選択されているかが表示されます。それはないファイルを選択するため。
最悪の場合、各ディレクトリで一度に1つずつMFIを使用でき、おそらくかなりの速度が得られます。 最良の場合、ディレクトリのネスト全体で必要な処理を実行できます。
Parallel Assignは、配列を埋め、スレッド間のエラーを防ぐ分離された環境で各配列要素を埋めるJSLを実行するように設計されています。 2つの異なるスレッドから同時にデータテーブルにアクセスするようなことを避けようとします。 それへの道を見つけたら、おそらくクラッシュするでしょう。
どうもありがとうございます。 スクリプトに複数のファイルのインポートを組み込むことができ、テーブルをより高速に連結できるようになりました。