循环行为非常慢我有一个关于循环所花时间的问题。
我正在分析大量生产数据,通常为 1mio 行。
对于每一行,生产捕获状态(列 Statusnummer)。
如果状态为“1”,那么我想计算实际值(“ist”)和设定值(“soll”)。
所以我需要计算 1mio 行。 我在代码中针对不同的值多次执行此操作。
有时,循环很快(60 秒),有时又非常(!)慢(超过一天! 处理器仍在满负荷工作!)。
所有列都设置为数字和连续,但我无法弄清楚为什么有些循环非常慢。
我什至检查单元格是否包含缺失值(参见示例代码);但代码仍然很慢。
知道吗,我做错了什么?
貂
代码示例,速度很慢:
for(i=1,i<=NRows(dt),i++,(
if(dt:Statusnummer[i] == 1,(
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]) ,(
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
));
));
));
回复:非常慢的循环行为@vince_faller凉爽的! 我只看到速度提高了大约 10 倍(这仍然非常惊人。)我怀疑这种加速与开始/结束数据更新无关,但我也认为矩阵分配将在内部执行类似开始/结束数据更新的操作。
@EvanMcCorkle
回复:非常慢的循环行为谢谢,可能(参见上面的评论,问题同时消失了)这就是原因,因为许多报告都是公开的。 但我现在无法重现。 我将在我的代码中介绍您的解决方案,看看它是否是永久修复。
貂回复:非常慢的循环行为更新:我添加了 get rows where 查找行的方法。显然,这有需要数字数据的限制,但我有时能够解决这个问题。
我非常喜欢用矩阵来做一切事情。
Names default to here(1);
dt = New Table("Test",
Add Rows(1000000),
New Column("Statusnummer", Set Each Value(Random Integer(0, 1))),
New Column("Drehzahl", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("geschw", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("SollDrehzahl", Set Each Value(Random Normal())),
New Column("Soll_drehzahl"),
New Column("Ist_drehzahl"),
New Column("Maschinenleistung"),
);
st = HPTime();
for(i=1,i<=NRows(dt),i++,
if(dt:Statusnummer[i] == 1,
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]),
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
);
);
);
t_loop = HPTime() - st;
st = HPTime();
m = dt[0, {"Statusnummer", "Drehzahl", "geschw"}]; // makes a matrix
//check the matrix
v = m[0, 1] // don't need to do a check if it's 0 or 1
&
!ismissing(m[0, 2]) // check if drehzahl is missing
&
!ismissing(m[0, 3]); // check if drehzahl is missing
rows = loc(v); // this is the rows you want to do stuff on now.
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_mat = HPTime() - st;
st = HPTime();
rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_get_where = HPTime() - st;
show(t_loop, t_mat, t_get_where);
当我进行这个比较时,我得到了
t_循环=11259288;
t_mat = 206942;
更新
t_loop = 11950585;
t_mat = 205366;
t_get_where = 6742823;
回复:非常慢的循环行为这可能会加快速度 - 将循环限制为仅满足条件的行。
found_rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
for (i = 1, i <= nrows(found_rows), i++,
k = found_rows[i];
dt:Soll_drehzahl[k] = dt:SollDrehzahl[k];
dt:Ist_drehzahl[k] = dt:Drehzahl[k];
dt:Maschinenleistung[k] = 100 * dt:Ist_drehzahl[k] / dt:Soll_drehzahl[k] ;
);回复:非常慢的循环行为也许您还有另一个打开的报告,并且正在针对您对表所做的每项更改进行更新。 您可以在循环之前和之后执行此操作:
dt << Begin Data Update;
// the loop
dt << End Data Update;
回复:非常慢的循环行为|嗨罗恩,谢谢。 嵌套循环旨在使其更快,
因为第一个条件在很多行中都失败了,这样循环就可以
(并且确实)使用下一行从顶部开始。所以从功能上来说
一切正常。 然而,我重新检查了一下,速度变慢了。 在里面
调试器中,数据表访问写回值花费了很长时间:
dt:Soll_drehzahl[i] = soll; dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;|
所以我把它们注释掉了 (//) ==> 结果:非常快
我删除了注释标记(//)并且......仍然非常快(!)
......(相同的代码,相同的结构,......)
现在它可以工作了,但我仍然不知道是什么导致了这个问题。 或许
我的系统中的某些内容已损坏。
感谢您的建议。
回复:非常慢的循环行为你好@MWalther
我会尝试按照杰夫建议使用列公式来做到这一点。不要忘记,一旦您不希望不断地重新评估公式,您可以随时删除公式或只是抑制它们的评估。
如果你坚持使用 for 循环方法,我会首先看看最后几个分号是否是必要的。
此外,我会尝试将嵌套的 if 语句简化为一个更长的条件列表。
最后,在子样本上使用调试器,看看循环中的哪些内容需要更多时间。 我有一种感觉,大部分时间都在做一些无意识的事情。
如果有任何改进请告诉我们。
回复:非常慢的循环行为亲爱的杰夫,感谢您的回答。 脚本中该位置的公式
没有帮助。 (这是我的排序和数据清理部分,我想要的地方
以避免公式)
我在不同的地方遇到同样的问题。 还有一些公式
也受到了影响。
看来,这个过程几乎完全冻结了(我数了1
行/秒!)尽管 CPU 继续加载!
然而,一旦完成,结果是正确的。
你的貂
回复:非常慢的循环行为您是否尝试过使用以下命令在数据表中构建这些列公式编辑器而不是用 JSL 循环? 这可能会更有效率。