모두,
누군가가 타임 매트릭스 대 데이터 테이블에 대해 유사한 추적을 수행했는지 궁금합니다.
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);


데이터 테이블을 비공개로 만들면 시간이 더 단축될 수 있지만 일반적으로 이것이 공정합니까 아니면 속도를 위해서만 다른 데이터 컨테이너보다 한 데이터 컨테이너를 선호합니까?
@gzmorgan0 ,
자세한 답변 감사합니다. 귀하의 해석은 대부분 정확하며 처음부터 더 명확하게 설명했으면 합니다. 데이터 테이블과 행렬 간의 기본 설정에 동의하고 공유합니다. 내장된 메서드 대 행렬이 더 필요한 경우 데이터 테이블을 사용할 것입니다. 그러나 커뮤니티의 두뇌를 선택하고 싶었던 질문은 대용량 데이터를 처리하는 속도와 데이터 크기가 증가함에 따라 동작이 변경되는지 여부와 이유였습니다. 말씀하신 스토리지 압축 때문이라고 믿고 싶습니다.
한 가지 흥미로운 측면은 데이터 테이블 서브스크립팅을 통해 절약되는 시간의 양입니다. = 7에서 성능 면에서 행렬이 여전히 선두를 달리고 있는 전통적인 열 공식 접근 방식에 비해 7초가 단축되었습니다.
2가지 질문이 있습니다. 공정한가요? 그리고 당신은 서로를 선호합니까?
공정한 것과 관련하여 메모리 관리는 모두 언어 제공자에게 달려 있습니다.테이블에는 행렬보다 더 많은 방법이 있습니다.나는 당신의 첫 번째 질문을 "100만에서 1000만 사이의 성능 변화가 예상됩니까?"라고 표현했을 것입니다. 또한 100만 행 후에 JMP가 일부 스토리지 압축, 즉 메모리 절약을 수행할 수 있다고 추측하고 있습니다. 절충점은 시간입니다.
내가 선호하는 것은 작업에 따라 다릅니다. 방법이 여러 번 적용되고 요약 성능을 얻는 시뮬레이션을 수행하는 경우 행렬을 사용합니다.하위 테이블 참조가 더 나은 JMP 13 이전에는 큰 테이블이 있는 경우 행렬로 작업한 다음 성능을 위해 특별히 테이블에 값을 설정하고 절대 큰 테이블에는 공식을 사용하십시오.
JMP 13 하위 테이블 참조 구문을 사용하는 세 번째 방법을 스크립트에 추가하는 스크립트를 첨부했습니다. 아래 스니펫은 추가 열에 대한 구문입니다. [이 사이트에서는 첨부 파일을 게시할 수 없으므로 작성 스크립트를 보려면 끝까지 가십시오.]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
성능에 관심이 있으므로 이것을 시도하십시오.
a=5;
tb1 = TickSeconds();
Mat_1 = Random Index(10^8,10^a);
te1 = TickSeconds();
tb2 = TickSeconds();
Mat_2 = Round (J(10^a, 1, Random Uniform(10^8) )*10^8,0);
te2 = TickSeconds();
show(te1-tb1, te2-tb2);
a<7의 경우 두 번째 방법이 방법 1보다 훨씬 우수합니다.
a = 6: te1 - tb1 = 2.43333333334886; te2 - tb2 = 0.25; //두 번째 메소드 상위
a = 7: te1 - tb1 = 2.48333333339542; te2 - tb2 = 2.56666666665114; //두 메소드 모두 동일
a = 8: te1 - tb1 = 3.03333333344199; te2 - tb2 = 25.8166666666511; //두 번째 방법은 훨씬 더 나쁨
그리고 당신처럼 큰 차이가있을 때 참고로 JMP에 메모를 보냅니다.
스크립트를 실행하는 사람들은 모든 테이블 등을 닫는다는 점에 주의하십시오. JMP의 새 세션에서 실행하십시오.
Clear Log(); Clear Globals(); Close All(DataTables,"No Save");
// Inputs
a = 7;
// Approach 1
TimerStart_1 = Tick Seconds();
dt1 = New Table("Approach-1","Invisible");
dt1 << New Column("Random-1",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Random-2",Numeric,Continuous,<< Set Values(Random Index(10^8,10^a)))
<< New Column("Add",Numeric,Continuous,Formula(:Name("Random-1")+:Name("Random-2")))
<< New Column("Subtract",Numeric,Continuous,Formula(:Name("Random-1")-:Name("Random-2")))
<< New Column("Multiply",Numeric,Continuous,Formula(:Name("Random-1")*:Name("Random-2")))
<< New Column("Mod",Numeric,Continuous,Formula(Mod(:Name("Random-1"),:Name("Random-2"))));
TimerEnd_1 = Tick Seconds();
Show(TimerEnd_1 - TimerStart_1);
Close All(DataTables,"No Save");
// Approach 2
TimerStart_2 = Tick Seconds();
Mat_1 = Random Index(10^8,10^a);
Mat_2 = Random Index(10^8,10^a);
Add = Mat_1 + Mat_2 ;
Difference = Mat_1 - Mat_2 ;
Prod =E Mult (Mat_1,Mat_2);
Mod = Mod(Mat_1,Mat_2);
TimerEnd_2 = Tick Seconds();
Show(TimerEnd_2 - TimerStart_2);
// Approach 3
TimerStart_3 = Tick Seconds();
dt1 = New Table("Approach-3","Invisible", add rows(10^a),
New Column("Random-1",Numeric,Continuous ),
New Column("Random-2",Numeric,Continuous ),
New Column("Add",Numeric,Continuous ),
New Column("Subtract",Numeric,Continuous ),
New Column("Multiply",Numeric,Continuous ),
New Column("Mod",Numeric,Continuous)
);
// Column(dt1, "Random-1") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Random-2") << Set Values( Random Index(10^8,10^a) );
// Column(dt1, "Add") << Set Values( dt1[0,"Random-1"]+ dt1[0,"Random-2"] );
// Column(dt1, "Subtract") << Set Values( dt1[0,"Random-1"]- dt1[0,"Random-2"] );
// Column(dt1, "Multiply") << Set Values( dt1[0,"Random-1"]:* dt1[0,"Random-2"] );
// Column(dt1, "Mod") << Set Values( Mod(dt1[0,"Random-1"], dt1[0,"Random-2"]) );
dt1[0,"Random-1"] = Random Index(10^8,10^a) ;
dt1[0,"Random-2"] = Random Index(10^8,10^a) ;
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
dt1[0, "Subtract"] = dt1[0,"Random-1"]- dt1[0,"Random-2"] ;
dt1[0, "Multiply"] = dt1[0,"Random-1"]:* dt1[0,"Random-2"] ;
dt1[0, "Mod"] = Mod(dt1[0,"Random-1"], dt1[0,"Random-2"] );
TimerEnd_3 = Tick Seconds();
Show(TimerEnd_3 - TimerStart_3);
Close All(DataTables,"No Save");