JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 뭉개지 않고도 JSL을 더 빠르게 실행할 수 있습니다.나는 현재 다항식 피팅을 실행할 큰 테이블이 있습니다.
1. 목표: 다항식 적합 매개변수를 생성하고 테이블로 내보냅니다.
2. 문제: 아래 JSL을 사용하면 전체 테이블을 실행하는 데 시간이 너무 오래 걸립니다. 그래서 나는 PC에 짓눌리는 것을 피하기 위해 실행하기 위해 테이블을 작은 그룹으로만 부분집합할 수 있습니다.
3. 이유: 아래 표는 먼저 다항식 곡선을 맞춘 다음 요약 표를 생성하고 마지막으로 모든 클래스를 1개의 표로 내보내야 합니다.
100k 클래스가 있다고 가정하면 다항식 곡선을 맞춘 다음 테이블로 내보내는 데 오랜 시간이 걸립니다.
4. 도움 필요: 누군가 JSL을 수정하는 데 도움을 줄 수 있습니까? 다항식 곡선으로 각 클래스에 맞게 만든 다음 테이블로 내보내고 다항식 곡선 창을 닫습니다. 이것은 저장합니다 DDR SDRAM 100k의 플롯 창을 생성하지 않고 100k 클래스의 테이블만 내보내는 모든 100k 클래스를 계속 실행합니다.
도와 주셔서 감사합니다.
dt = Current Data Table();
biv = Bivariate( Y( :weight ), X( :age ), Fit Polynomial( 2, {Line Color( {47, 193, 29} )} ), By( :class ) );
rbiv = biv << report;
Summarize( groups = by( class ) ); // A list of all by-groups
n = N Items( groups );
//Create output table and fill with estimates
dtOut = New Table( "Polynominal parameters",
New Column( "class", Character ),
New Column( "T", numeric ),
New Column( "T2", numeric ),
addrows( n )
);
For( j = 1, j <= n, j++,
Estimates = rbiv[j]["Polynomial Fit Degree=2"]["Parameter Estimates"][1][3] << get as matrix;
:class[j] = groups[j];
:T[j] = Estimates[2];
:T2[j] = Estimates[3];
);
Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.Parallel Assign에 대한 저의 시도입니다.나는 그것이 어떻게 작동하는지 아직도 배우고 있다.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age));
::results = J(nitems(ages), 3, -1);
driver = ::results[0, 1];
age_rows = {};
for(i=1, i<=nitems(ages), i++,
insert into(age_rows, dt << Get Rows Where(:age == Num(ages[i])));
);
y = dt:height << Get Values();
x = dt:weight << Get Values();
m = mean(x);
Parallel Assign({a = ages, ar = age_rows, y = y, x = x, m = m},
driver[i] = (
rows = ar[i];
ys = y[rows];
xs = x[rows];
xs2 = xs||(xs-m)^2;
print(i, ys, xs2);
batch interactive(1);
Try({b, vb} = Least Squares Solve(ys, xs2));
batch interactive(0);
::results[i, 0] = b`
);
);
show(::results);Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.실제 플롯에 신경 쓰지 않는다면 몇 가지 다른 방법이 있습니다.나는 때때로 많은 양의 플롯을 렌더링하기 위해 속도가 느려지는 것을 봅니다.
1. 플랫폼 없이 계산합니다.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, ages = By(:age));
dtOut = New Table( "Polynominal parameters",
New Column( "class", Character ),
New Column( "T", numeric ),
New Column( "T2", numeric ),
addrows(nitems(ages))
);
for(i=1, i<=nitems(ages), i++,
rows = dt << Get Rows Where(:age == Num(ages[i]));
y = dt:height[rows];
x = dt:weight[rows];
x2 = x||(x-ColMean(dt:weight))^2;
{b, vb} = Least Squares Solve(y, x2);
dtOut:class[i] = ages[i];
dtOut:T[i] = b[2];
dtOut:T2[i] = b[3];
);
2. by 변수로 여러 차트를 그리는 대신 변수별 그룹으로 하나의 차트를 그릴 수 있습니다(때로는 이 도움을 받았습니다).
biv = dt << Bivariate(
Y( :height ),
X( :weight ),
Group By(:age),
Fit Polynomial( 2 ),
invisible
);
report(biv)["Parameter Estimates"][TableBox(1)] << Make Combined Data Table
그리고 <Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.
고마워, 이것은 내 원래 솔루션보다 더 나은 솔루션입니다.
나는 For 루프를 추가하여 큰 테이블을 작은 테이블로 부분집합하고 스크립트를 사용하여 내 문제를 해결합니다.
Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.다음 코드로 시작해보세요.
dt1 = Current Data Table();
// launch Bivariate with more than one By group, save list of analysis layer references
biv = dt1 << Bivariate( Y( :weight ), X( :age ), By( :sex ), Fit Polynomial( 2 ) );
// obtain first report layer reference and save
rbiv = biv[1] << Report;
// use first reference to send table box message
dt2 = rbiv["Parameter Estimates"][TableBox(1)] << Make Combined Data Table;
// process results as a data table
그런 다음 필요에 맞게 데이터 테이블을 수정하는 코드를 추가합니다.
Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.답장을 보내 주셔서 감사합니다.
위의 jsl을 기반으로 수정하는 데 도움을 줄 수 있습니까?
어떻게 해야할지 불명...
Re: JSL 효율성 향상: 각 실행 후 플롯 창을 닫는 방법으로 PC를 크러시하지 않고도 JSL을 더 빠르게 실행할 수 있습니다.모든 클래스를 반복할 필요는 없습니다. << Make Combined Data Table을 첫 번째 Parameter Estimates 개요의 Table Box로 보냅니다.