腳本和非常大的文件我有一個腳本可以導入許多文件並將它們連接起來。
該文件可以超過 4100 萬行,並且可以達到 10 千兆位(我有 100 GB 可用空間和 128GB 內存:使用 JMP16.2)
然後我有腳本來選擇行和列等。我的問題實際上不是關於腳本本身,而是為什麼如果我按順序運行每個腳本而不是包含所有腳本的腳本,JMP“掛起”。
例如, 一切似乎都正常,如果我按順序運行每個 JSL,它就會正常工作
1.Concat_files.JSL
2.Change_Test_Instance_Name.JSL
3.Summarize_Test_Instance.JSL
與
為我運行上述每一個腳本的腳本......
例如,
運行所有腳本.JSL
包括(“ADDIN_HOME(my_scripts)\Concat_files.jsl”);
包括((“ADDIN_HOME(my_scripts)\Change_Test_Instance_Name.JSL”);
包括(“ADDIN_HOME(my_scripts)\Summarize_Test_Instance.JSL.jsl”);
這只是掛起我的系統......我打開了日誌,我可以看出它卡在下一個腳本中(日誌顯示一條顯示語句,如 show("Entering Change_Test_Instance name");
我嘗試過使用 wait();每個包含之間的語句(以及每個腳本內),但這仍然不起作用。還有什麼我應該嘗試的嗎?
自動化和腳本編寫回复:腳本和非常大的文件抱歉回复晚了(工作忙)。
感謝您的想法。我從來沒有使用過調試器。
我也會看看命名空間的想法。我還發現,如果我打開主 DT(它已連接),然後使用 include 語句運行腳本,它也會像我按原樣運行腳本時一樣快(不包含)。因此,主數據表在內存中一段時間與連接然後立即運行包含腳本有關。
回复:腳本和非常大的文件您也許可以使用 JSL 調試器/分析器運行代碼,或者像您一樣使用更細粒度的 time_start..time_end 來檢測它。 我的猜測是,由於某些原因,代碼具有 N^2 行為(將數據加倍的 4 倍時間)。 可能是某個名稱與數據表中的名稱衝突的名稱空間問題。
一個可能不好的地方是
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
但如果不計時就很難知道。 如果 Test_names 可能有 1e6 個項目,而 dt_summary 可能有 1e6 行,則平均每 1e6 行將檢查 500,000 個 test_name。 或者也許只有 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來源選項卡
回复:腳本和非常大的文件看起來我粘貼了相同的日誌......
這是獨自跑步時...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;
回复:腳本和非常大的文件我讓腳本運行以查看它是否被卡住(看起來它正在運行,但在腳本中運行時需要幾個小時,而不是幾分鐘)。
我只在日誌中顯示語句。
這是在腳本中運行腳本的日誌輸出。(“更改為一個測試實例”需要 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();回复:腳本和非常大的文件您是否打開/關閉報告窗口,可能是 100 秒還是 1000 秒? 根本不打開窗戶可能會有很大幫助。 (操作系統可能沒有機會清理某些內容。)
您是否要將 1000 行打印到 JMP 16 日誌中? 有一個使用舊日誌格式的偏好可能會有所幫助。
任務管理器可能會提供一些見解。 查看句柄和 GDI 對像以及明顯的內存和磁盤罪魁禍首。
或者檢查計算機前面的磁盤指示燈(如果有)。 聽起來你不應該進行尋呼,那是一台很好的計算機!
我想知道當你得到答案時發生了什麼;如果以上都沒有幫助,技術支持也可以提供幫助。