Qual è il modo più veloce per popolare una nuova colonna con i valori dei caratteri?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao, ho uno script che esegue una concatenazione avanzata di tabelle e desidero aggiungere "colonne di origine" per indicare i nomi delle tabelle originali. Ho alcuni metodi che funzionano ma tutti sono lenti per tavoli di grandi dimensioni. Ho anche provato un metodo di formula, ma non è stato neanche veloce. C'è qualche altro trucco che posso usare?
L'esempio qui sotto corrisponde molto da vicino a quello che sto facendo. Le dimensioni della tabella dati di 1 milione di righe non sono insolite, quindi mi piacerebbe davvero ridurre questa operazione nei pochi secondi per le tabelle di grandi dimensioni.
Grazie,
Mike
dt = nuova tavola () ;
dtList = { dt } ;
rowCount = 50000 ;
dt << aggiungere righe ( rowCount ) ;
tempo2 = Oggi () ;
Se ( 0 ,
dt << nuova colonna ( "test" , carattere , impostare ciascun valore ( eval ( dtList [ 1 ]) << ottenere nome )) ; // 24 secondi a 50k righe.
,
tempList = {} ;
per ( io = 1 , io <= rowCount , io ++, tempList [ io ] = eval ( dtList [ 1 ]) << ottenere nome ) ; //104 sec a 50k righe.
dt << nuova colonna ( "test" , carattere , valori ( templista )) ;
) ;
spettacolo ( eval ( Oggi () - tempo2 )) ;
Re: Qual è il modo più veloce per popolare una nuova colonna con i valori dei caratteri?C'è un modo più semplice del mio primo esempio, almeno per questo caso.
start = Tick Secondi();
dt = Nuova tabella();
dt << Nuova colonna( "test", Carattere, "Nominale", Formula( Eval( dt << getname ) ));
dt << addrows( 1e7 );
dt << runformulas;
stop = Tick Secondi();
Mostra( stop - start );
L'argomento Formula del messaggio NewColumn in una tabella di dati è stato originariamente progettato per essere molto facile da usare per i casi comuni, qualcosa come
Formula (altezza + peso)
dove altezza e peso sono colonne della tabella dati e l'aggiunta deve essere eseguita su ogni riga.Pertanto, Formula non valuta il suo argomento, ma memorizza semplicemente l'espressione non valutata come formula della colonna.
A meno che... la funzione esterna non lo sia Valuta(...) che vedi nell'esempio più semplice sopra.Quando l'argomento formula(...) viene elaborato, cerca Eval e utilizza il risultato valutato.Ci sono altri posti in JMP che fanno anche questo.E ci sono altri posti, come la funzione sostitutiva, che usano Espr(...) per impedire una valutazione degli argomenti dell'espressione.
Re: Qual è il modo più veloce per popolare una nuova colonna con i valori dei caratteri?Grazie Craig. Dopo aver pubblicato il mio messaggio originale, mi è venuto in mente che la funzione di tabelle concatenate () nativa di JMP ha l'opzione "crea colonna di origine" e sono stato in grado di trovare il codice utilizzando la funzione di concatenazione standard e quindi fare clic sul triangolo rosso / script sorgente per vedere come ha funzionato. Questa opzione non sembra essere documentata da nessuna parte.Il mio script funziona con due copie delle tabelle originali, quindi questa soluzione intermedia ha richiesto una piccola manipolazione per riportarla ai nomi delle tabelle originali.Se fossero stati i tavoli originali, questa sarebbe stata una buona soluzione.
Il tuo metodo è abbastanza pulito e certamente è veloce. La necessità di qualcosa di simile si presenta abbastanza spesso, quindi lo aggiungerò ai segnalibri. Penso che sia ora che impari il valore di queste combinazioni di funzioni. Li ho visti usati, li ho usati quando mi è stato detto che è come far funzionare correttamente qualcosa, ma raramente mi sembra di essere in grado di riconoscere quando usarlo. Questa volta ci sono stato vicino... Pensavo di aver funzionato la formula (menzionata in OP) ma guardando il codice ricordo che non ha funzionato perché l'espressione è appena apparsa nella formula. Ho pensato che avrei avuto bisogno di qualcosa del genere, ma non ero sicuro di come farlo.
Esiste una regola empirica su quali tipi di funzioni possono/devono essere racchiusi nelle espressioni per ottimizzare i miei script? O consiglieresti semplicemente di eseguirlo e fare un'analisi dei tempi e correggere ciò che è lento, che è quello che faccio?
Grazie ancora,
Mike
PS grazie per avermi ricordato i tick secondi(). Sapevo che c'era una funzione migliore di today() per questo.
Re: Qual è il modo più veloce per popolare una nuova colonna con i valori dei caratteri?start = Tick Secondi();
dt = Nuova tabella();
Eval(
Eval Expr(
dt << Nuova colonna( "test",
Carattere,
"Nominale",
Formula( Espr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << runformulas;
stop = Tick Secondi();
Mostra( stop - start );
stop - start = 3.80000000004657; // 10.000.000 di righe in 4 secondi
Il modello eval( evalExpr( ... expr( ... ) ... )) è un modo per manipolare un'espressione in JMP.Per capirlo, inizia con EvalExpr( ... ) che esamina il suo argomento per trovare qualsiasi Expr( ... ). le parti Expr vengono valutate e il risultato (una stringa in questo caso) viene lasciato al posto di Expr.Il risultato di EvalExpr è un'espressione, che deve essere valutata dall'esterno eval(...)
Potrebbe esserci un modo più veloce; Non ho esplorato molto lontano.
