腳本和非常大的文件我有一個腳本可以導入許多文件並將它們連接起來。
該文件可以超過 4100 萬行並且在 10 千兆位(我有 100 GB 可用空間和 128 GB 內存:使用 JMP16.2)
然後我有腳本來選擇行和列等。我的問題真的不是關於腳本本身,而是為什麼如果我按順序運行每個腳本而不是讓一個包含所有腳本的腳本,JMP“掛起”。
例如, 一切似乎都有效,如果我按順序運行每個 JSL,它就可以工作
1. 連接文件.JSL
2. Change_Test_Instance_Name.JSL
3. Summarize_Test_Instance.JSL
對比
為我運行上述每一項的腳本......
例如,
Run_all_scripts.JSL
include("ADDIN_HOME(my_scripts)\Concat_files.jsl");
包括((“ADDIN_HOME(my_scripts)\Change_Test_Instance_Name.JSL”);
include("ADDIN_HOME(my_scripts)\Summarize_Test_Instance.JSL.jsl");
這只是掛起我的系統....我打開了日誌,我可以看出它卡在下一個腳本中(日誌顯示了一個 show 語句,如 show("Entering Change_Test_Instance name");
我嘗試過使用 wait();每個包含之間的語句(以及每個腳本內),但這仍然不起作用。還有什麼我應該嘗試的嗎?
數據表其他腳本回复:腳本和非常大的文件您是否打開/關閉報告窗口,可能是 100 或 1000? 根本不打開窗戶可能會有很大幫助。 (可能操作系統沒有機會清理某些東西。)
您是否在 JMP 16 日誌中打印 1000 行? 有一個使用舊日誌格式的偏好可能會有所幫助。
任務管理器可能會提供一些見解。 查看句柄和 GDI 對像以及明顯的內存和磁盤罪魁禍首。
或者檢查計算機前面的磁盤指示燈(如果有的話)。 聽起來您不應該分頁,那是一台不錯的計算機!
我想知道當你得到答案時發生了什麼;如果以上沒有任何幫助,技術支持也可以提供幫助。
回复:腳本和非常大的文件我讓腳本運行以查看它是否被卡住(似乎它正在運行,但在腳本中運行時需要幾個小時,而不是幾分鐘)。
我在日誌中只有顯示語句。
這是在腳本中運行腳本的日誌輸出。(如果我自己在同一個文件上運行相同的腳本,“更改為一個測試實例”需要 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();回复:腳本和非常大的文件看起來我粘貼了相同的日誌....
這是一個人跑步的時候...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;
回复:腳本和非常大的文件您可能能夠使用 JSL 調試器/分析器運行代碼,或者像您正在做的那樣使用更細粒度的 time_start..time_end 來檢測它。 我的猜測是代碼具有 N^2 行為(數據翻倍的 4 倍時間),出於某種原因,包含。 可能是某個名稱的命名空間問題與數據表中的名稱衝突。
一個可能不好的地方是
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。
該圖標的工具提示顯示“運行分析器”。
您也許可以使用藍色暫停按鈕或等待它結束,然後檢查熱點:
來源標籤
來源標籤