매우 느린 루프 동작루프에 소요되는 시간에 관해 질문이 있습니다.
저는 일반적으로 100만 행에 달하는 더 많은 양의 프로덕션 데이터를 분석하고 있습니다.
각 행에 대해 프로덕션에서는 상태(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;
));
));
));
Re: 매우 느린 루프 동작@vince_faller 시원한! 나는 약 10배 더 빠른 것을 볼 수 있습니다(아직도 꽤 놀랍습니다.) 이 속도 향상은 시작/끝 데이터 업데이트와 관련이 없다고 생각하지만 행렬 할당이 내부적으로 시작/끝 데이터 업데이트와 같은 작업을 수행할 것이라고 생각합니다.
@EvanMcCorkle
Re: 매우 느린 루프 동작감사합니다. 아마도(위 설명 참조, 문제는 사라졌습니다) 많은 보고서가 열려 있었기 때문에 이것이 이유였습니다. 하지만 지금은 재현할 수 없습니다. 내 코드에 귀하의 솔루션을 소개하고 그것이 영구적인 수정인지 확인하겠습니다.
담비Re: 매우 느린 루프 동작업데이트 : 행을 찾는 방법을 추가했습니다.분명히 여기에는 숫자 데이터가 필요하다는 제한이 있지만 때로는 그 문제를 해결할 수 있습니다.
저는 행렬을 사용하여 모든 작업을 수행하는 것을 좋아합니다.
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_loop = 11259288;
t_mat = 206942;
업데이트됨
t_loop = 11950585;
t_mat = 205366;
t_get_where = 6742823;
Re: 매우 느린 루프 동작이렇게 하면 작업 속도가 빨라질 수 있습니다. 조건을 충족하는 행으로만 루프를 제한하세요.
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] ;
);Re: 매우 느린 루프 동작아마도 열려 있고 테이블을 변경할 때마다 업데이트되는 다른 보고서가 있을 수 있습니다. 루프 전후에 이 작업을 수행할 수 있습니다.
dt << Begin Data Update;
// the loop
dt << End Data Update;
Re: 매우 느린 루프 동작|안녕 론, 고마워요. 중첩 루프는 속도를 높이기 위한 것입니다.
첫 번째 조건이 여러 줄에서 실패하기 때문에 루프가
(그리고 그렇습니다) 다음 행을 사용하여 맨 위에서 시작합니다. 그래서 기능성에서
모든 것이 작동합니다. 그런데 다시 확인해 보니 속도가 느려졌습니다. 에서
디버거에서는 값을 다시 쓰기 위한 데이터 테이블 액세스에 시간이 오래 걸렸습니다.
dt:Soll_drehzahl[i] = soll; dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;|
그래서 나는 그것들을 주석 처리했습니다(//) ==> 결과: 매우 빠릅니다.
주석(//)을 지웠는데.....아직도 엄청 빠르네요(!)
.......(동일한 코드, 동일한 구조,....)
이제 작동하지만 문제의 원인이 무엇인지 아직 알 수 없습니다. 아마도
내 시스템의 뭔가가 손상되었습니다.
제안해 주셔서 감사합니다.
Re: 매우 느린 루프 동작안녕 @MWalther
Jeff가 열 수식을 사용하여 제안한 대로 이 작업을 수행하려고 합니다. 지속적으로 재평가되는 것을 원하지 않으면 언제든지 수식을 제거하거나 평가를 억제할 수 있다는 것을 잊지 마십시오.
for 루프 방법을 사용하려고 한다면 먼저 마지막 몇 개의 세미콜론이 필요한지 확인해야 합니다.
게다가 중첩된 if 문을 하나의 긴 조건 목록으로 단순화하려고 합니다.
마지막으로 하위 샘플에서 디버거를 사용하여 루프에서 더 많은 시간이 걸리는 부분을 확인합니다. 의도하지 않은 일을 하고 있어 대부분의 시간이 걸리는 느낌이 듭니다.
개선된 사항이 있으면 알려주세요.
Re: 매우 느린 루프 동작친애하는 Jeff, 답변 해 주셔서 감사합니다. 스크립트 위치의 수식
도와주지 마세요. (이것은 내가 원하는 정렬 및 데이터 정리 섹션입니다.
공식을 피하기 위해)
나는 다른 장소에서 같은 문제를 겪고 있습니다. 그리고 몇 가지 수식
영향도 받았습니다.
프로세스가 거의 완전히 정지된 것 같습니다(1을 세었습니다.)
행/초!) CPU가 계속 로드되지만!
그러나 일단 완료되면 결과는 정확합니다.
당신의 마틴
Re: 매우 느린 루프 동작다음을 사용하여 데이터 테이블에 해당 열을 작성해 보셨나요? 수식 편집기 JSL로 반복하는 대신? 그게 더 효율적일 수도 있습니다.