Was ist der schnellste Weg, eine neue Spalte mit Zeichenwerten zu füllen?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo, ich habe ein Skript, das eine erweiterte Tabellenverkettung durchführt, und ich möchte „Quellspalten“ hinzufügen, um die ursprünglichen Tabellennamen anzugeben. Ich habe ein paar Methoden, die funktionieren, aber alle sind bei großen Tabellen langsam. Ich habe es auch mit einer Formelmethode versucht, aber es ging auch nicht schnell. Gibt es einen anderen Trick, den ich anwenden kann?
Das folgende Beispiel entspricht sehr genau dem, was ich tue. Datentabellengrößen von 1 Mio. Zeilen sind nicht ungewöhnlich, daher würde ich diesen Vorgang bei großen Tabellen wirklich gerne auf die unteren Sekunden reduzieren.
Danke,
Mike
dt = neuer Tisch () ;
dtList = { dt } ;
Reihenanzahl = 50000 ;
dt << Zeilen hinzufügen ( Reihenanzahl ) ;
Zeit2 = Heute () ;
Wenn ( 0 ,
dt << neue Kolumne ( "prüfen" , Charakter , Legen Sie jeden Wert fest ( evalu ( dtList [ 1 ]) << Namen bekommen )) ; // 24 Sek. bei 50.000 Zeilen.
,
tempList = {} ;
für ( ich = 1 , ich <= Reihenanzahl , ich ++, tempList [ ich ] = evalu ( dtList [ 1 ]) << Namen bekommen ) ; //104 Sek. bei 50.000 Zeilen.
dt << neue Kolumne ( "prüfen" , Charakter , Werte ( Templist )) ;
) ;
zeigen ( evalu ( Heute () - Zeit2 )) ;
Betreff: Was ist der schnellste Weg, eine neue Spalte mit Zeichenwerten zu füllen?Zumindest für diesen Fall gibt es einen einfacheren Weg als mein erstes Beispiel.
start = Tick Seconds();
dt = Neue Tabelle();
dt << Neue Spalte( "test", Zeichen, "Nominal", Formel( Eval( dt << getname ) ) );
dt << addrows( 1e7 );
dt << runformulas;
stop = Tick Seconds();
Show( stop - start );
Das Formula-Argument der NewColumn-Nachricht an eine Datentabelle war ursprünglich so konzipiert, dass es für häufige Fälle sehr einfach zu verwenden ist, etwa
Formel (Größe + Gewicht)
Dabei sind Höhe und Gewicht Datentabellenspalten und die Addition sollte in jeder Zeile erfolgen.Formula wertet sein Argument also nicht aus, sondern speichert lediglich den nicht ausgewerteten Ausdruck als Formel der Spalte.
Es sei denn ... die äußere Funktion ist Auswerten(...) was Sie im einfacheren Beispiel oben sehen.Wenn das Argument „formel(...)“ verarbeitet wird, sucht es nach „Eval“ und verwendet das ausgewertete Ergebnis.Es gibt auch andere Stellen in JMP, die dies tun.Und es gibt andere Stellen, wie die Ersatzfunktion, die verwendet werden Ausdruck(...) um eine Auswertung von Ausdrucksargumenten zu verhindern.
Betreff: Was ist der schnellste Weg, eine neue Spalte mit Zeichenwerten zu füllen?Danke Craige. Nachdem ich meine ursprüngliche Nachricht gepostet hatte, fiel mir auf, dass die native Tabellenfunktion concatate() von JMP über die Option „Quellspalte erstellen“ verfügt, und ich konnte den Code dazu mithilfe der Standardfunktion zum Verketten finden und dann auf das rote Dreieck klicken /source-Skript, um zu sehen, wie es funktioniert. Diese Option scheint nirgendwo dokumentiert zu sein.Mein Skript arbeitet mit zwei Kopien der Originaltabellen, daher erforderte diese Zwischenlösung ein wenig Manipulation, um wieder die ursprünglichen Tabellennamen zu erhalten.Wären es die Originaltische gewesen, wäre das eine gute Lösung gewesen.
Ihre Methode ist ziemlich sauber und sicherlich schnell. Der Bedarf für so etwas kommt ziemlich oft vor, deshalb werde ich dieses mit einem Lesezeichen versehen. Ich denke, es ist an der Zeit, den Wert dieser Funktionskombinationen kennenzulernen. Ich habe gesehen, wie sie verwendet wurden, ich habe sie verwendet, wenn mir gesagt wurde, dass es darum geht, etwas richtig zum Laufen zu bringen, aber ich scheine selten in der Lage zu sein, zu erkennen, wann ich es verwenden soll. Diesmal war ich nah dran... Ich dachte, ich hätte die Formel zum Laufen gebracht (im OP erwähnt), aber als ich mir den Code ansah, fiel mir ein, dass es nicht funktionierte, weil der Ausdruck einfach in der Formel auftauchte. Ich dachte, dass ich so etwas brauchen würde, war mir aber nicht sicher, wie ich es machen sollte.
Gibt es eine Faustregel darüber, welche Arten von Funktionen in Ausdrücke eingeschlossen werden können/sollten, um meine Skripte zu optimieren? Oder würden Sie empfehlen, es einfach auszuführen, eine Timing-Analyse durchzuführen und zu beheben, was langsam ist, was ich mache?
Danke noch einmal,
Mike
PS: Danke, dass du mich an Tick-Sekunden() erinnert hast. Ich wusste, dass es dafür eine bessere Funktion als today() gibt.
Betreff: Was ist der schnellste Weg, eine neue Spalte mit Zeichenwerten zu füllen?start = Tick Seconds();
dt = Neue Tabelle();
Bewertung(
Eval Expr(
dt << Neue Spalte( "test",
Charakter,
„Nominal“,
Formel( Expr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << runformulas;
stop = Tick Seconds();
Show( stop - start );
Stopp - Start = 3.80000000004657; // 10.000.000 Zeilen in 4 Sekunden
Das Muster eval( evalExpr( ... expr( ... ) ... )) ist eine Möglichkeit, einen Ausdruck in JMP zu manipulieren.Um es zu verstehen, beginnen Sie mit EvalExpr( ... ), das sein Argument durchsucht, um Expr( ... ) zu finden. Die Expr-Teile werden ausgewertet und das Ergebnis (in diesem Fall eine Zeichenfolge) wird anstelle des Expr belassen.Das Ergebnis von EvalExpr ist ein Ausdruck, der vom äußeren eval(...) ausgewertet werden muss.
Es könnte einen schnelleren Weg geben; Ich habe nicht sehr weit erkundet.
