子設置表中JMP中的最大問題.... 低迷我已經使用多種方法來對長表進行子集化(行> 100K,非常常見的數據表大小)。出現問題是因為子集需要選擇行,這意味著在子集化之前對錶進行操作。如果桌子很長,它會很慢。特別是當需要foor循環來通過每次新參數的子集來生成繪圖時。
無論你使用什麼都沒關係,它只是很慢:我不確定JMP團隊是否有任何解決方案來加速子集化??????
選擇行在哪裡
得到行在哪裡
Re:子設置表中JMP中的最大問題.... 低迷為什麼要對數據表進行子集化?
嘗試選擇您不想要的數據,設置隱藏和排除行狀態,製作繪圖,然後重複下一組。
Re:子設置表中JMP中的最大問題.... 低迷此外,您可以使用過濾器完成相同的任務嗎?
Re:子設置表中JMP中的最大問題.... 低迷我想我清楚地提到,當您選擇數據時會出現問題,這會減慢數據的速度。
但我可能無法理解你的建議。你能提供JSL的例子嗎?我肯定會嘗試加快速度。
謝謝
內存
Re:子設置表中JMP中的最大問題.... 低迷@Dan_Obermiller
你可以添加JSL在for循環中執行此操作而不會彈出過濾器嗎?
謝謝
Re:子設置表中JMP中的最大問題.... 低迷如果我使用獲取行甚至只是行,我從來沒有遇到過問題。 你實際上不必選擇它們。
names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
rows = dt << Get Rows Where(:sex == "M");
dt_sub = dt << Subset(rows(rows));
你用什麼來選擇行?這可能很慢。
Re:子設置表中JMP中的最大問題.... 低迷這是一個簡單的示例,說明如何在沒有子集的情況下按組進行分析
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
// Reset the data table row states
dt << clear row states;
// Find the different values for Sex
Summarize( byGroup = By( :sex ) );
// Loop across the different groups and analyze them
For( i = 1, i <= N Items( byGroup ), i++,
// Reset the data table row states
dt << clear row states;
// Hide and Exclude the unwanted rows
dt << select where( :Sex != byGroup[i] );
dt << hide and exclude;
// Run the analysis
ow = dt << oneway( x( :age ), y( :height ) );
// Change the title of the report to show what data are in the analysis
Report( ow )[Outline Box( 1 )] << set title(
Report( ow )[Outline Box( 1 )] << get title || ": Sex=" || byGroup[i]
);
);
// Reset the data table row states
dt << clear row states;
Re:子設置表中JMP中的最大問題.... 低迷聽起來你的腳本中有幾件事情 - 選擇,子集,創建報告,都在循環中。 我認為看一個示例腳本會很有幫助。 如何進行選擇?子集是否鏈接到原始數據表?正在創建哪些平台?運行此循環的迭代次數是多少?如果子集表已鏈接,並且報表已啟用自動重新計算,那麼可能每次迭代都會使進程變慢,因為所有先前的報表都會收到有關源表中發生的選擇的通知。 如果這是問題,那麼其他人建議的數據過濾方法可能會解決問題,因為每個報告都會與循環的下一次迭代隔離開來。
Re:子設置表中JMP中的最大問題.... 低迷 @vince_faller 目前我使用相同的方法。但是當文件大小變大時,甚至得到行矩陣變得越來越大。
如果你使用像小數據表
<SPAN class="token string">Big Class.jmp</SPAN>
什麼都行不通 問題在於大數據文件。
Re:子設置表中JMP中的最大問題.... 低迷@txnelson
你的aproach有兩個問題。
1。你正在使用“選擇哪裡(”這是更大表的真正根本原因。一旦你使用select更新選擇行的數據表的操作(在我的情況下> 300K行)你只是使用Big類,甚至沒有計算文件大小。
2。這不適用於下面的情況
如果我必須將X_axis上的身高數據與性別=“M”相關聯,將Y_axis身高數據與性別=“F”相關聯。
我希望它可以幫助你解決現在的問題
謝謝
Re:子設置表中JMP中的最大問題.... 低迷@danschikore
它不是迭代次數。當文件大小較大時,選擇的行很慢。
Re:子設置表中JMP中的最大問題.... 低迷所以這張表有一百萬行。 運行需要六分之一秒。 這可能與你的腳本有關。 喜歡 @danschikore 說,如果你給一個示例腳本運行緩慢,我們可以幫助你。
Names Default to Here( 1 );
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
如果你打電話給第二個緩慢的六分之一,那麼我不知道該告訴你什麼。
Re:子設置表中JMP中的最大問題.... 低迷所以這張表有一百萬行。 運行需要六分之一秒。 這可能與你的腳本有關。 就像Dan說的那樣,如果你給出了一個運行緩慢的示例腳本,我們可以幫助你。
Names Default to Here( 1 );
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
如果你打電話給第二個緩慢的六分之一,那麼我不知道該告訴你什麼。
另外,如果你使用for循環為每個參數生成一堆圖,你有沒有理由不使用by?
Re:子設置表中JMP中的最大問題.... 低迷也許你的選擇標準非常複雜,這就是減慢速度的原因。 除非您提供以下內容,否則我們無法幫助您:
1。你的腳本
2。您的數據樣本(必要時匿名)
Re:子設置表中JMP中的最大問題.... 低迷@pmroz
@vince_faller
只是在這裡實際而不是純粹的理論家。
下面是添加了一些列的腳本。根據運行情況,結果最多可能需要2秒。我還添加了一個等待(0),以便它也可以容納更新顯示時間。
這段時間只是subsetiing兩個文件。之後,您可以通過某些條件添加腳本加入兩個文件所需的額外時間。然後製作一個雙變量圖表。它真的變慢了。
一個很有價值的數據是足夠的速度。但如果我再添加幾個......
Try(close(datatable("Test"),nosave));
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
Re:子設置表中JMP中的最大問題.... 低迷我們只能做理論上的東西,因為你沒有告訴我們你在做什麼。
因此,當運行它時,對於我來說,單個表(不是其中兩個)需要大約0.3秒。我發現這完全合理。 如果你和子集一起做了很多其他動作,那麼說子集很慢是不公平的。 如果你在for循環中運行它們,那麼很可能你在for循環中正在做什麼導致問題。 如果您正在運行腳本,那麼我會說不要等待(0),除非您需要用戶查看該表。 事實上,你應該將它們設為私有/不可見,這樣它們就不會渲染和使用不必要的時間。
你究竟想做什麼?我覺得這是一個 XY問題 。
如果你讓我們知道你在做什麼,我們可能會幫助你加快速度。
Re:子設置表中JMP中的最大問題.... 低迷你的“獲取行在哪裡”查詢有多複雜?您發布的內容應該非常快,因為它只查找一個值,但我看到更複雜的查詢會降低性能。
這是一個簡單的例子,它通過使子集不可見然後是私有來顯示子命令的時間差。
dt = data table("Probe");
t1 = hp time();
new_rows = dt << get rows where(:Process == "New");
t2 = hp time();
old_rows = dt << get rows where(:Process == "Old");
t3 = hp time();
//s1 = dt << subset(rows(new_rows), invisible);
s1 = dt << subset(rows(new_rows), private);
t4 = hp time();
//s2 = dt << subset(rows(old_rows), invisible);
s2 = dt << subset(rows(old_rows), private);
t5 = hp time();
tn = t2 - t1;
to = t3 - t2;
ts1 = t4 - t3;
ts2 = t5 - t4;
print("New rows: " || char(tn));
print("Old rows: " || char(to));
print("New subset: " || char(ts1));
print("Old subset: " || char(ts2));
不可見的子集時間:
"New rows: 1095"
"Old rows: 964"
"New subset: 3527"
"Old subset: 3366"
私人子集時間:
"New rows: 949"
"Old rows: 883"
"New subset: 1861"
"Old subset: 1638"
正如您所看到的,從不可見變為私有將子集時間減少了一半。
Re:子設置表中JMP中的最大問題.... 低迷我的電腦真的很忙,所以數字會有所不同,但是更改為鏈接的子集並刪除等待會有所幫助。刪除等待與隱形大致相同;它從測量中得到了表格的油漆到屏幕。使用鏈接子集是一個巨大的勝利,因為不再需要移動大量數據。
st=HPTIME();
rows = dt << Get Rows Where(:X == "C");
dt << Subset(rows(rows),outputtable("sub1"),"linked");
rows = dt << Get Rows Where(:X == "B");
dt << Subset(rows(rows),outputtable("sub2"),"linked");
//wait(0);
st=1e-6*(HPTIME()-st);
print(char(st)|| " Sec");
“2.534772秒” - 與等待(0)取消關聯
“1.50435秒” - 取消關聯
“0.467098秒” - 鏈接
Re:子設置表中JMP中的最大問題.... 低迷根據它的聲音,您可以按列對錶進行子集化並將它們連接在一起。 你可能只是過度簡化它,例如,但如果我想繪製Y(高度,性別== M),X(身高,性別== F)。 我只想分開桌子。 這兩個腳本(子集和連接與拆分)顯示拆分佔用了大約三分之一的時間。
names default to here(1);
dt = new table("Test",
add rows(1000000),
New column("sex", character, <<SET each="" value=""></SET>
此外,使用Linked您無法更改列名和其他屬性,因此您無法更改列的名稱,因此連接看起來有點醜陋。
Re:子設置表中JMP中的最大問題.... 低迷以下是對我正在做的事情的簡單概述。請記住,這是最簡單的數據表和腳本形式,與實際相比仍然很快。我在我的comp上跑了這個並獲得平均2秒。有人說這不錯。但請記住,我們談論的是計算機時間而非人類時間。2秒就像WW2時期。
您可以嘗試這一點來了解它有多糟糕:在“添加行(1000000)”中減少和增加行數10倍。
Try(close(datatable("Test"),nosave));
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>Re:子設置表中JMP中的最大問題.... 低迷最大的問題可能是你沒有提到更新/加入。

Re:子設置表中JMP中的最大問題.... 低迷@HI @ram_asra_gmail_ ,
我不確定這在速度方面引入了多少問題,但它肯定會在結果方面:更新的語法看起來不正確。使用Update的匹配列的正確規範是Match Columns()不匹配列()。 後者會將更新表粘貼到原始表的行上,這實際上很可能比實際匹配更快。 如果你使用Join,那就是“通過匹配列()”。
這是更新的正確語法:
datatable("sub1") << update(
With( Data Table( "Sub2" ) ),
Match Columns( :X1 = :X2, :P1 = :P2 )
);
當然不是唯一發生的事情,但我想應該提一下,以防其他地方沒有發現!
@julian
Re:子設置表中JMP中的最大問題.... 低迷是的,這與子集化表幾乎沒有關係。 我可以把這個腳本減少到100行,它仍然需要7秒。
我的第一個建議是不要獨立運行每個雙變量。 將它們作為平台(或在vlistbox()內部)運行,以便它們不進行評估和追加。 然後就在最後展示。 這樣做讓我花了3秒鐘。 附上腳本。
但它真的看起來你只是想分割一個數據表。 拆分功能可能比這更好。 如果你出於某種原因必須這樣做。我將所有dt_sub1表與一個by列連在一起並立即運行它們。 但我敢打賭,這可以優化一噸。
Re:子設置表中JMP中的最大問題.... 低迷使用更正的語法引用 @julian 減少的行數10,000我的平均執行時間為 2.45 秒(我也使雙變量不可見)。
使用不可見聯接替換更新會將平均執行時間減少到 0.67 秒。 對此至關重要的是放棄雙變量不需要的列。 不丟棄它們會使它明顯變慢。
如果連接是瓶頸,您可能需要考慮執行虛擬連接。 要做到這一點,首先需要創建一個單獨的列,該列將是連接的唯一鍵。
Re:子設置表中JMP中的最大問題.... 低迷我認為這個技巧可以幫助減少一些時間。我已經利用了隱形子集。但它只能做這麼多。
謝謝你做了一些實驗。Re:子設置表中JMP中的最大問題.... 低迷 @Craige_Hales 鏈接子集似乎可以減少很多時間。但我必須檢查腳本,我發布了兩件事:
1。通過重複,我獲得了改進的平均時間
2。我是否仍然可以加入兩個子集表,隨後製作XY圖表。
謝謝