スクリプトと非常に大きなファイル多くのファイルをインポートしてそれらを連結するスクリプトがあります。
このファイルは 4,100 万行を超え、数十ギガビットになる可能性があります (数百 GB の空き容量と 128GB のメモリがあります: JMP16.2 を使用しています)。
次に、行や列などを選択するスクリプトを作成します。私の質問は実際にはスクリプト自体に関するものではなく、すべてのスクリプトを含むスクリプトを使用するのではなく、各スクリプトを順番に実行すると、なぜ JMP が「ハング」するのかということです。
例えば、 各JSLを順番に実行すると、すべてが機能するように見えます
1.Concat_files.JSL
2.Change_Test_Instance_Name.JSL
3. Summarize_Test_Instance.JSL
対
上記のそれぞれを実行するスクリプト...
例えば、
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)\Summarize_Test_Instance.JSL.jsl");
これではシステムがハングしてしまうだけです...ログを開いていると、次のスクリプトでスタックしていることがわかります (ログには show("Entering Change_Test_Instance name"); のような show ステートメントが表示されます。
wait(); を使ってみました。各インクルード間 (および各スクリプト内) にステートメントを追加しても、それでも機能しません。他に試すべきことはありますか?
自動化とスクリプト作成Re: スクリプトと非常に大きなファイル返信が遅くなり申し訳ありません(仕事が忙しくて)。
アイデアをありがとう。デバッガを使用したことがありません。
名前空間のアイデアについても見ていきます。また、メイン DT を開いて (連結されている)、include ステートメントを使用してスクリプトを実行すると、スクリプトをそのまま (インクルードなし) で実行した場合と同じくらい高速に実行されることもわかりました。つまり、メインデータテーブルがしばらくメモリ内にあるのに対して、連結してすぐにインクルードスクリプトを実行するということについてです。
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_name が 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 時間の実行を行わないでください。インクルードを使用して小さなプログラムを試し、必ず次のボタンを操作してください。
Something in the toolboxSomething in the toolbox工具箱の中に何かが入っている
A new window opens, the clock is for timing JSL.A new window opens, the clock is for timing JSL.新しいウィンドウが開き、クロックは JSL のタイミングを計るためのものです。
The tooltip for the icon says "run profiler".The tooltip for the icon says "run profiler".アイコンのツールチップには「プロファイラーを実行」と表示されます。
青い一時停止ボタンを使用するか、ボタンが終了するのを待ってからホット スポットを調べることができる場合があります。
tabs for sourcestabs for sourcesソースのタブ
tabs for sourcestabs for sourcesソースのタブ
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: スクリプトと非常に大きなファイルスクリプトを実行して、スタックしているかどうかを確認します (実行されているように見えますが、スクリプト内で実行すると数分ではなく数時間かかります)。
ログには 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;
同じ大きなファイルを使用して Reduce テスト インスタンス スクリプトを単独で実行すると、次のようなログが出力されます。
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: スクリプトと非常に大きなファイルレポート ウィンドウを数百単位または数千単位で開閉していますか? 窓をまったく開けないことは、大いに役立つかもしれません。 (おそらく、OS に何かをクリーンアップする機会が与えられていない可能性があります。)
JMP 16 ログに数千行を出力していますか? 役立つ可能性のある古いログ形式を使用するための設定があります。
タスク マネージャーを使用すると、何らかの洞察が得られる可能性があります。 ハンドルと GDI オブジェクト、および明らかなメモリとディスクの原因を調べてください。
または、コンピュータの前面にあるディスク ライトがある場合は、それを確認します。 ページングをする必要はないようです。それは素晴らしいコンピュータです。
回答が得られたときに何が起こっていたのか知りたいです。上記で解決しない場合は、テクニカル サポートも役立ちます。