子设置表中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图表。
谢谢