スクリプトと非常に大きなファイル多くのファイルをインポートして連結するスクリプトがあります。
このファイルは4,100万行を超える可能性があり、数十ギガビットになります(数百GBの空き容量と128GBのメモリがあります:JMP16.2を使用)
次に、行や列などを選択するためのスクリプトがあります。私の質問は、実際にはスクリプト自体に関するものではありませんが、すべてのスクリプトを含むスクリプトを使用するのではなく、各スクリプトを順番に実行すると、JMPが「ハング」するのはなぜですか。
例えば、 各JSLを順番に実行すると、すべてが機能しているように見えます。
1. Concat_files.JSL
2. Change_Test_Instance_Name.JSL
3. Summarize_Test_Instance.JSL
vs
上記のそれぞれを実行するスクリプト...
例えば、
Run_all_scripts.JSL
include( "ADDIN_HOME(my_scripts)\ Concat_files.jsl");
include(( "ADDIN_HOME(my_scripts)\ Change_Test_Instance_Name.JSL");
include( "ADDIN_HOME(my_scripts)\ Summary_Test_Instance.JSL.jsl");
これは私のシステムをハングさせるだけです...ログを開いていますが、次のスクリプトでスタックしていることがわかります(ログには、show( "Entering Change_Test_Instance name")のようなshowステートメントが表示されます)。
wait();を使用してみました。各インクルード間の(および各スクリプト内の)ステートメントですが、それでも機能しません。他に試すべきことはありますか?
データ表他のスクリプティングRe:スクリプトと非常に大きなファイルレポートウィンドウを開いたり閉じたりしていますか?おそらく数百または数千ですか? 窓をまったく開かないことは大いに役立つかもしれません。 (おそらく、OSは何かをクリーンアップする機会を得ていません。)
JMP 16ログに数千行を印刷していますか? 役立つ可能性のある古いログ形式を使用する設定があります。
タスクマネージャーはいくつかの洞察を提供するかもしれません。 ハンドルとGDIオブジェクト、および明らかなメモリとディスクの原因を確認してください。
または、コンピュータの前面にあるディスクライトがある場合は、それを確認します。 ページングする必要があるようには聞こえません、それは素晴らしいコンピュータです!
あなたが答えを得たときに何が起こっていたのか知りたいのですが。上記の何も役に立たない場合は、テクニカルサポートも役立ちます。
Re:スクリプトと非常に大きなファイルスクリプトを実行して、スタックしていないかどうかを確認します(実行中のように見えますが、スクリプト内で実行する場合は数分ではなく、数時間かかります)。
ログにはshowステートメントしかありません。
スクリプト内でスクリプトを実行するためのログ出力は次のとおりです。(「1つのテストインスタンスへの変更」には3.65時間かかりますが、同じファイルで同じスクリプトを自分で実行した場合は3.65分かかります)。CPUは3.65時間で12コア(CPU0からCPU11)を約20%実行していました
以下は、JSLのログとスニペットです。
N Items(files_open) = 12;
"Files are Concatenated ";
As Date(Today()) = 14Feb2022:13:00:32;
start_time - As Date(Today()) = -492;
"Saving Digital_shmoo_all";
As Date(Today()) = 14Feb2022:13:00:54;
"Done Saving Digital_shmoo_all";
As Date(Today()) = 14Feb2022:13:01:24;
"Changing to one test instance";
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 14Feb2022:13:01:39;
"Reducing Test Instances Ended";
As Date(Today()) = 14Feb2022:16:41:13;
start_time - As Date(Today()) = -13174;
"Transposing";
"File has been transposed";
As Date(Today()) = 14Feb2022:16:42:23;
start_time - As Date(Today()) = -69;
同じ大きなファイルを使用してreducetest instanceスクリプトを単独で実行すると、次のログが表示されます
As Date(Today()) = 14Feb2022:13:01:24;
"Changing to one test instance";
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 14Feb2022:13:01:39;
"Reducing Test Instances Ended";
As Date(Today()) = 14Feb2022:16:41:13;
start_time - As Date(Today()) = -13174;
"Transposing";
"File has been transposed";
As Date(Today()) = 14Feb2022:16:42:23;
start_time - As Date(Today()) = -69;
このスクリプトの基本は、「Char_Char」で始まる名前を検索し、「Char_Char」が含まれないように名前を変更することです。これを行うには、サマリーテーブルを作成し、「Char_Char」を持つサマリーテーブルの行を選択し、選択されたメインテーブルの行を取得してから、メインテーブルの名前を変更します。これが遅いスクリプトの抜粋です。
One_Test_Instance.JSL
dt = Current Data Table();
Names Default To Here( 1 );
Show( N Rows( dt ), "In Reduce_Test_Instance" );
Show( As Date( Today() ) );
start_time = As Date( Today() );
dt << clear select;
dt << clear column selection;
Wait();
Test_names = {};
dt << Summary(
Group( :Test_Instance ),
Freq( "None" ),
Weight( "None" ),
output table name( "Summary_of_Table" )
);
dt_summary = Current Data Table();
Wait();
For Each Row( Insert Into( Test_names, dt_summary:Test_Instance ) );
Wait();
For( i = N Items( Test_names ), i > 0, i--,
If( (!Contains( Test_names[i], "CHAR_char" )),
Remove From( Test_names, i )
)
);
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
Wait();
aa = dt << get selected rows; //Get selected rows in main table
Wait();
Close( dt_summary, nosave );
If( N Rows( aa ) > 0,
(dt:Test_instance[aa]) = "CHAR_char_meas_TI";
(dt:Setup[aa]) = "meas_TI"; //Change name in main table
);
dt << clear select;
dt << clear column selection;
Wait();Re:スクリプトと非常に大きなファイル同じログを貼り付けたようです。
これが一人で走っているときです...200秒または約3.33分
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 15Feb2022:10:11:57;
"Reducing Test Instances Ended";
As Date(Today()) = 15Feb2022:10:15:17;
start_time - As Date(Today()) = -200;
Re:スクリプトと非常に大きなファイルJSLデバッガー/プロファイラーを使用してコードを実行することも、実行しているように、よりきめ細かいtime_start..time_endを使用してコードをインストルメント化することもできます。 私の推測では、コードは何らかの理由でインクルードを使用してN ^ 2の動作(データを2倍にするための4倍の時間)を持っています。 データテーブル内の名前と衝突する名前の名前空間の問題である可能性があります。
悪いかもしれない1つの場所は
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
しかし、タイミングをとらなければ知るのは難しいです。 Test_namesに1e6の項目があり、dt_summaryに1e6の行がある場合、平均して500,000のtest_namesが各1e6の行で検査されます。 あるいは、たぶん10かそこらしかなく、それは問題ではありません。 おおよそこのように書き直したいかもしれません
// untested. combine two loops and use an aa rather than a list for lookup
Test_names = AssociativeArray();
For Each Row(
If( ( Contains( dt_summary:Test_Instance, "CHAR_char" )),
Test_names[ dt_summary:Test_Instance ] = 1
)
);
dt_summary << select where( Test_names<<CONTAINS></CONTAINS>
リストに数百の項目がある場合、連想配列ははるかに高速になります。
JSLプロファイラーを使用する場合は、最初のプロファイリングエクスペリエンスで3時間実行しないでください。インクルードを使用して小さなプログラムを試して、次のボタンで遊んでください。
ツールボックスの何か
新しいウィンドウが開き、時計はJSLのタイミングを計るためのものです。
アイコンのツールチップには「プロファイラーの実行」と表示されます。
青い一時停止ボタンを使用するか、ボタンが終了するのを待ってから、ホットスポットを調べることができる場合があります。
ソースのタブ
ソースのタブ