Quel est le moyen le plus rapide de remplir une nouvelle colonne avec des valeurs de caractères ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour, j'ai un script qui effectue une concaténation de tables avancée et je souhaite ajouter des « colonnes source » pour indiquer les noms de tables d'origine. J'ai quelques méthodes qui fonctionnent mais toutes sont lentes pour les grandes tables. J'ai aussi essayé une méthode de formule mais ce n'était pas rapide non plus. Y a-t-il une autre astuce que je peux utiliser ?
L'exemple ci-dessous correspond très étroitement à ce que je fais. Les tailles de table de données de 1 million de lignes ne sont pas inhabituelles, j'aimerais donc vraiment réduire cette opération en quelques secondes pour les grandes tables.
Merci,
Mike
dt = nouveau tableau () ;
dtListe = { dt } ;
nombre de lignes = 50000 ;
dt << ajouter des lignes ( nombre de lignes ) ;
heure2 = aujourd'hui () ;
si ( 0 ,
dt << nouvelle colonne ( "test" , personnage , définir chaque valeur ( évaluer ( dtListe [ 1 ]) << obtenir un nom )) ; // 24 secondes à 50 000 lignes.
,
liste temp = {} ;
pour ( je = 1 , je <= nombre de lignes , je ++, liste temp [ je ] = évaluer ( dtListe [ 1 ]) << obtenir un nom ) ; //104 secondes à 50 000 lignes.
dt << nouvelle colonne ( "test" , personnage , valeurs ( modèle )) ;
) ;
montrer ( évaluer ( aujourd'hui () - heure2 )) ;
Re : Quel est le moyen le plus rapide de remplir une nouvelle colonne avec des valeurs de caractères ?Il existe un moyen plus simple que mon premier exemple, du moins pour ce cas.
start = Cocher les secondes ();
dt = Nouvelle table ();
dt << Nouvelle colonne( "test", Caractère, "Nominal", Formule( Eval( dt << getname ) ) );
dt << addrows( 1e7 );
dt << exécuter des formules ;
stop = Cocher les secondes ();
Afficher( arrêter - démarrer );
L'argument Formule du message NewColumn dans une table de données a été conçu à l'origine pour être très facile à utiliser dans les cas courants, quelque chose comme
Formule (taille + poids)
où la taille et le poids sont des colonnes du tableau de données et l'ajout doit être effectué sur chaque ligne.Ainsi, Formula n'évalue pas son argument, mais stocke simplement l'expression non évaluée comme formule de la colonne.
À moins que... la fonction externe soit Évaluer(...) que vous voyez dans l’exemple le plus simple ci-dessus.Lorsque l'argument formula(...) est traité, il recherche l'Eval et utilise le résultat évalué.Il existe d'autres endroits dans JMP qui font également cela.Et il existe d'autres endroits, comme la fonction de substitution, qui utilisent Exprim (...) pour empêcher une évaluation des arguments d’expression.
Re : Quel est le moyen le plus rapide de remplir une nouvelle colonne avec des valeurs de caractères ?Merci Craige. Après avoir publié mon message d'origine, je me suis rendu compte que la fonction de tables concatenate() native de JMP avait l'option « créer une colonne source », et j'ai pu trouver le code correspondant à l'aide de la fonction de concaténation standard, puis cliquer sur le triangle rouge. / script source pour voir comment cela fonctionnait. Cette option ne semble être documentée nulle part.Mon script fonctionne avec deux copies des tables d'origine, cette solution intermédiaire a donc nécessité une petite manipulation pour revenir aux noms de tables d'origine.S'il s'agissait des tableaux d'origine, cela aurait été une bonne solution.
Votre méthode est assez propre et certainement rapide. Le besoin de quelque chose comme celui-ci revient assez souvent, je vais donc mettre celui-ci en signet. Je pense qu'il est temps que j'apprenne la valeur de ces combinaisons de fonctions. Je les ai vus utilisés, je les ai utilisés quand on m'a dit comment faire fonctionner quelque chose correctement, mais il me semble rarement être capable de reconnaître quand l'utiliser. J'étais proche cette fois... Je pensais que la formule fonctionnait (mentionnée dans OP), mais en regardant le code, je me souviens que cela n'a pas fonctionné car l'expression vient d'apparaître dans la formule. Je pensais que j'aurais besoin de quelque chose comme ça, mais je ne savais pas comment le faire.
Existe-t-il une règle générale concernant les types de fonctions qui peuvent/doivent être enveloppées dans des expressions pour optimiser mes scripts ? Ou recommanderiez-vous simplement de l'exécuter, de faire une analyse du timing et de corriger ce qui est lent, ce que je fais ?
Merci encore,
Mike
PS merci de m'avoir rappelé les ticks seconds(). Je savais qu'il y avait une meilleure fonction qu'aujourd'hui() pour ça.
Re : Quel est le moyen le plus rapide de remplir une nouvelle colonne avec des valeurs de caractères ?start = Cocher les secondes ();
dt = Nouvelle table ();
Évaluer(
Expr d'évaluation (
dt << Nouvelle colonne( "test",
Personnage,
"Nominal",
Formule (Expr (dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << exécuter des formules ;
stop = Cocher les secondes ();
Afficher( arrêter - démarrer );
arrêt - démarrage = 3,80000000004657 ; // 10 000 000 de lignes en 4 secondes
Le modèle eval( evalExpr( ... expr( ... ) ... )) est un moyen de manipuler une expression dans JMP.Pour le comprendre, commencez par EvalExpr( ... ) qui examine son argument pour trouver n'importe quel Expr( ... ). les parties Expr sont évaluées et le résultat (une chaîne dans ce cas) est laissé à la place de Expr.Le résultat de EvalExpr est une expression qui doit être évaluée par le eval(...) externe
Il pourrait y avoir un moyen plus rapide ; Je n'ai pas exploré très loin.
