새 열을 문자 값으로 채우는 가장 빠른 방법은 무엇입니까?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하세요, 저는 고급 테이블 연결을 수행하는 스크립트를 가지고 있는데, 원래 테이블 이름을 나타내기 위해 '소스 열'을 추가하고 싶습니다. 작동하는 몇 가지 방법이 있지만 큰 테이블에서는 모두 속도가 느립니다. 저도 공식 방법을 시도해 보았으나 역시 빠르지는 않았습니다. 제가 사용할 수 있는 다른 트릭이 있나요?
아래 예는 내가 하고 있는 일과 매우 유사합니다. 1M 행의 데이터 테이블 크기는 드문 일이 아니므로 큰 테이블의 경우 이 작업을 짧은 시간 안에 수행하고 싶습니다.
감사해요,
마이크
dt = 새 테이블 () ;
dtList = { dt } ;
행 개수 = 50000 ;
dt << 행 추가 ( 행 개수 ) ;
시간2 = 오늘 () ;
만약에 ( 0 ,
dt << 새 열 ( "시험" , 성격 , 각각의 값을 설정 ( 평가 ( dtList [ 1 ]) << 이름을 얻다 )) ; // 50,000행에서 24초.
,
임시 목록 = {} ;
~을 위한 ( 나 = 1 , 나 <= 행 개수 , 나 ++, 임시 목록 [ 나 ] = 평가 ( dtList [ 1 ]) << 이름을 얻다 ) ; //50,000행에서 104초.
dt << 새 열 ( "시험" , 성격 , 가치 ( 임시 직원 )) ;
) ;
보여주다 ( 평가 ( 오늘 () - 시간2 )) ;
Re: 새 열을 문자 값으로 채우는 가장 빠른 방법은 무엇입니까?적어도 이 경우에는 첫 번째 예보다 더 쉬운 방법이 있습니다.
start = 틱 초();
dt = 새 테이블();
dt << 새 열( "테스트", 문자, "명목", 공식( 평가(dt << getname) ) );
dt << addrows( 1e7 );
dt << 실행수식;
stop = Tick Seconds();
표시( 중지 - 시작 );
데이터 테이블에 대한 NewColumn 메시지의 Formula 인수는 원래 다음과 같은 일반적인 경우에 매우 쉽게 사용할 수 있도록 설계되었습니다.
공식(키 + 몸무게)
여기서 키와 몸무게는 데이터 테이블 열이며 추가는 각 행에서 수행되어야 합니다.따라서 Formula는 인수를 평가하지 않고 평가되지 않은 표현식을 열의 수식으로 저장합니다.
그렇지 않은 이상...외부 기능은 다음과 같습니다. 평가(...) 위의 더 쉬운 예에서 볼 수 있습니다.Formula(...) 인수가 처리되면 Eval을 찾고 평가된 결과를 사용합니다.JMP에는 이 작업을 수행하는 다른 곳도 있습니다.그리고 대체 기능과 같이 다음을 사용하는 다른 곳도 있습니다. 특급(...) 표현식 인수의 평가를 방지합니다.
Re: 새 열을 문자 값으로 채우는 가장 빠른 방법은 무엇입니까?고마워요 크레이지. 원본 메시지를 게시한 후 JMP의 기본 테이블 연결() 함수에 '소스 열 생성' 옵션이 있다는 생각이 들었습니다. 표준 연결 기능을 사용하여 이에 대한 코드를 찾은 다음 빨간색 삼각형을 클릭할 수 있었습니다. / 소스 스크립트가 어떻게 작동하는지 확인하세요. 이 옵션은 어디에도 문서화되어 있지 않은 것 같습니다.내 스크립트는 원본 테이블의 두 복사본에서 작동하므로 이 중간 솔루션에는 원본 테이블 이름을 다시 가져오려면 약간의 조작이 필요했습니다.원래 테이블이었다면 이것은 좋은 솔루션이었을 것입니다.
귀하의 방법은 상당히 깨끗하고 확실히 빠릅니다. 이와 같은 필요성이 상당히 자주 발생하므로 이것을 북마크에 추가하겠습니다. 이제 그 기능 조합의 가치를 배울 때가 된 것 같습니다. 나는 그것들이 사용되는 것을 보았고, 무언가가 제대로 작동하도록 하는 방법이라는 말을 들었을 때 사용했지만, 언제 사용해야 하는지 거의 인식하지 못하는 것 같습니다. 이번에는 가까웠는데... 나는 수식이 작동한다고 생각했지만(OP에 언급됨) 코드를 보면 표현식이 수식에 방금 표시되었기 때문에 작동하지 않았다는 것을 기억합니다. 나는 이런 것이 필요하다고 생각했지만 어떻게 해야 할지 몰랐습니다.
내 스크립트를 최적화하기 위해 어떤 유형의 함수를 표현식으로 래핑할 수 있거나 래핑해야 하는지에 대한 경험 법칙이 있습니까? 아니면 그냥 실행하고 타이밍 분석을 수행하여 느린 문제를 수정하는 것이 좋습니다. 제가 하는 일이 바로 그것입니다.
다시 한 번 감사드립니다.
마이크
추신: 틱 초()에 대해 상기시켜 주셔서 감사합니다. 나는 today()보다 더 나은 기능이 있다는 것을 알았습니다.
Re: 새 열을 문자 값으로 채우는 가장 빠른 방법은 무엇입니까?start = Tick Seconds();
dt = 새 테이블();
평가(
평가 표현식(
dt << 새 열( "테스트",
성격,
"명사 같은",
공식( Expr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << 실행수식;
stop = Tick Seconds();
표시( 중지 - 시작 );
중지 - 시작 = 3.80000000004657; // 4초에 10,000,000개 행
eval( evalExpr( ... expr( ... ) ... )) 패턴은 JMP에서 표현식을 조작하는 한 가지 방법입니다.이를 이해하려면 인수를 살펴보고 Expr( ... )을 찾는 EvalExpr( ... )부터 시작하세요. Expr 부분이 평가되고 결과(이 경우 문자열)가 Expr 대신 남습니다.EvalExpr의 결과는 외부 eval(...)에 의해 평가되어야 하는 표현식입니다.
더 빠른 방법이 있을 수 있습니다. 나는 아주 멀리 탐험하지 않았습니다.
