回复:加快表/更新速度首先,进度条可以帮助用户
...略:明白了Jmp并没有崩溃,而是在后台做了一些事情。
回复:加快表/更新速度试试这个 - 40 名学生,N x:
Names Default to Here(1);
// adjust the size and check// +1 means: data table size x 2// ... and update time x 4
mySize=12;
dt0 = Open( "$SAMPLE_DATA/Big Class.jmp" );
increaseSize= Function({dt,cycles},
for(i=1,i<=cycles,i++,
dt << Concatenate(dt, Append to first table))
);
increaseSize(dt0,mySize);
show(nrows (dt0));
dt2 = subset(dt0);
//if you are brave, enable this:
/*for (i=1,i<5,i++,
dt2 << new column("new", set each value (random uniform()))
);*/
//generate a list of columns which should be added
Cols = dt2 << get column names();
remove from (cols, {1,2,3} );
dt0 << Delete Columns( :height, :weight );
t1=hptime();
Eval(Eval Expr(dt0 << Update(
With( dt2 ),
Match Columns( :name = :name, :sex = :sex ),
Add Columns from Update Table(
Expr(Cols)
),
Replace Columns in Main Table( None )
)));
show((hptime()-t1)/1000000); // on my notebook: ~ 15s per column
close(dt0, noSave);
close(dt2, noSave);回复:加快表/更新速度有趣的是:禁用
remove from (cols, {1,2,3} );表/更新花费额外 10 秒。
似乎行匹配不仅针对添加的每一列进行。
在某种程度上,它也适用于已经存在的列。
回复:加快表/更新速度一个可以取代表格/更新具有用户定义的平台。
- 它将添加/替换列设置为已选/无(代替全部/全部) --> 预览时评估的列更少
- 用户定义的按钮好的(高速)转换设置后可以触发Tables/Join
通过 UpdateHS()

Names Default to Here(1);
dt = Current Data Table();
If(isempty(dt) | N rows(dt )==0, stop());
Try( myDTUpdate << close window() );
myDTUpdate = New Window( "Update - high speed", dt << update() );
myDTUpdate[Lineup Box( 1 )] << Prepend( mb = MouseBox( Button Box( "OK (HS)", updateHS() ) ) );
mb << settooltip( "high speed via Tables/join" );
//DtUpdateHS:myDTUpdate["Preview", CheckboxBox( 1 )] << set( 1, 0 );
myDTUpdate["Add Columns from Update Table", Radio Box( 1 )] << set( 3 );
myDTUpdate["Replace Columns in Main Table", Radio Box( 1 )] << set( 2 );
回复:加快表/更新速度看来如果UPDATE不使用它自己的功能,可以实现巨大的改进
...但只是在后台触发了 JOIN。
回复:加快表/更新速度关于 Tables/Join 和 Tables/Update 之间的速度差异,我从 Jmp 支持 (TS-00044631) 得到反馈:
根据设计,当存在多个匹配项时,更新和加入会执行不同的操作。[...]加入使用第一的匹配,所以一旦找到匹配就完成了。
[...]更新[看起来]所有这些匹配,应用每一个,并且仅最后一个棍子。 *)
这解释了由于数据的许多副本而导致上述特殊情况的巨大时间差异。
因此,如果您的表具有非唯一值和许多列,则在使用 Update 时要小心。
另一方面,如果 Jmp 检查是否存在,该问题将很容易解决非唯一值和许多列在决定计算预览之前:)
*) Jmp 支持的这个示例很好地说明了 Tables/Join 和 Tables/Update 之间的区别:
请注意,已加入表有所有1位于 col2 中,而更新表有所有3位于第 2 列。
dt0 = New Table( "MyTable",
Add Rows( 3 ),
New Column( "col1",
Character, "Nominal",
Set Values({"a", "a", "a"})
),
New Column( "col2",
Numeric,
"Continuous",
Set Values([1, 2, 3])
)
);
dt2 = subset( dt0 );
Cols = dt2 << get column names();
Remove From( cols, {1} );
dt0 << Delete Columns( :col2 );
Eval(Eval Expr(dt0 << Join(
With( dt2 ),
Select( :col1 ),
SelectWith(Expr( Cols) ),
By Matching Columns( :col1 = :col1 ),
Drop multiples( 0, 1 ),
Preserve main table order( 1 ),
)));
Eval(
Eval Expr(
dt0 << Update(
With( dt2 ),
Match Columns( :col1 = :col1 ),
Add Columns from Update Table( Expr( Cols ) ),
Replace Columns in Main Table( None )
)
)
);回复:加快表/更新速度
@hogi写道:
但我担心该函数只是检查表的长度 - 而不是列数。
实际上,Tables/Update 似乎检查了列数
- 如果列数 > 100,则自动更新被禁用。
但 Jmp 似乎只是检查主表的行数/列数
不是第二个表的。
因此,如果主表的 # of cols 太大,预览将被禁用 - 尽管 # cols (主表) 对速度没有任何影响
Names Default to Here(1);
// adjust the size and check// +1 means: data table size x 2//
mySize1=7;
dt0 = Open( "$SAMPLE_DATA/Big Class.jmp" );
new column ("one", set each value(1));
increaseSize= Function({dt,cycles},
for(i=1,i<=cycles,i++,
dt << Concatenate(dt, Append to first table))
);
increaseSize(dt0,mySize1);
numberRows0 = Nrows(dt0);
dt2 = dt0 << Subset( All rows, columns( :name, :age ) );
for (i=1,i<1000,i++,
dt2 << new column("new", set each value (random uniform()))
);
numberRows2 = Nrows(dt2);
dt2Name = dt2 << get name();
New Column( "Rank", Formula( Col Rank( Row(), :name ) ));
Try(updateWindow << close window());
updateWindow = New window("are you brave?",
dt 0 << update()
);
updateWindow[Text Box(1)] << background color (Orange) << text color (white )<< set font ("Arial Black", 10)
<< set text("The tables have <10k rows. \!nBut the second table has > 1000 columns. \!nSo I deactivated the preview for you.\!nIf you have some time, activate it again ...");
updateWindow["Preview", CheckboxBox( 1 )] << set( 1, 0 );
updateWindow[ListBoxBox( 1 )] << set selected (loc(updateWindow[ListBoxBox( 1 )] <<GET items=""></GET>
编辑:
有时值得努力添加额外的匹配条件(例如源表中的排名)
这减少了匹配的数量并极大地加快了预览和实际更新的速度。
加速表格/更新是什么启发了这个愿望清单请求?
☐ 很酷的新功能
☑ 可以帮助很多用户!
☑ 删除“错误”
☐ 很高兴有
☐ 没人需要它
#我的Top10_2023
(这个或表连接:更新主表的选项)
我们有一个解决方法 -> 我们不再需要它了
表格更新是一个非常好的平台,可用于将列合并到数据表中或使用另一个数据表中的数据更新列。
但有时用户必须等待很长时间才能直到 Jmp 完成数据表更新 - 即使对于中大型数据表。
有时,在更新 GUI 中编辑设置时 Jmp 已经卡住。
然后看起来 Jmp 崩溃了 - 但几分钟后(或有时是几小时),Jmp 完成了数据预览的计算并再次让用户有机会编辑设置。
显然,将一个表中的数十万个值与另一个表中的值进行匹配需要一段时间。
但令我惊讶的是,合并两列所花的时间是合并一列的两倍
是否会为合并的每一列再次触发匹配步骤 - 或者实际上是对值的排序花费了这么长时间?
通常,我在源表中没有唯一标识符:单个匹配值在一列中出现多次 - 在要合并的列中也有相同的值。 在这种情况下,我想知道第一个匹配的值是否输入到目标数据表中,然后由第二个匹配的值替换 - 依此类推...
可以通过搜索源表中的最后一个匹配值并插入该值来加速此过程。
更新平台的一大缺点:
它从添加列和替换激活的列开始。
如果表格有 1000 列,则需要一段时间才能将所有列添加到预览窗口。
该问题与 rows_main x rows_2nd x columns_2nd 成比例。
尽管我很愚蠢,但我经常从定义匹配列开始......这使我能够走很长一段路,直到我被允许选择我真正想要添加到表中的(1-2)列。
如果表格太大,则可以禁用预览功能。
但我担心该函数只检查表的长度,而不是列数。
还是门槛太大?
请分享您的经验 - 在预览选项卡更新后,您需要多久填充一次时间才能让您的 Jmp 会话再次返回。
另一个问题是召回按钮
(此处解决: 通过调用填充 GUI 时禁用预览)
单击“调用”后,“更新”菜单中将填充已保存的设置 - 并且每次更改 GUI 设置后,预览选项卡似乎都会更新。
因此,如果您想加入大型数据表 - 即使您只想添加单个列 - 在禁用预览之前不要按“调用...”。
您希望看到什么改进?
您能否提高表/更新的性能?
为什么这个想法很重要?
Tables/Update 是一个很棒的功能。预览选项卡非常有用,如果没有它,我就不想工作。
但是我开始变得偏执——下次当我尝试向数据表中添加列时需要多长时间。
数据混合和清理回复:加速表格/更新我们这边的优先级很低 - 我们按照https://community.jmp.com/t5/JMP-Wish-List/Speed-up-Tables-Update/idc-p/653334/highlight/true#M4531的想法实施了一个解决方法