Tous,
Vous vous demandez si quelqu'un a fait des pistes similaires à la matrice temporelle par rapport à la table de données.
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);


Rendre la table de données privée peut gagner du temps, mais en général, est-ce juste ou est-ce que quelqu'un favorise un conteneur de données plutôt qu'un autre uniquement pour la vitesse ?
@gzmorgan0 ,
Merci pour votre réponse détaillée. Votre interprétation est généralement exacte et j'aurais aimé fournir plus de clarté pour commencer. Je suis d'accord et partage vos préférences entre les tables de données et les matrices, j'utiliserais des tables de données si j'avais besoin de plus de méthodes intégrées par rapport aux matrices. Cependant, la question sur laquelle je voulais attirer l'attention des communautés était la vitesse de traitement des données volumineuses et si et pourquoi le comportement change-t-il à mesure que la taille des données augmente. J'aimerais croire que c'est à cause de la compression de stockage à laquelle vous faites référence.
Un aspect intéressant est le gain de temps grâce à la sous-écriture des tables de données. À a = 7, il rasait 7 bonnes secondes par rapport à l'approche traditionnelle de la formule de colonne - avec des matrices toujours en tête en termes de performances.
Vous avez 2 questions : est-ce juste ? et préférez-vous l'un à l'autre ?
En ce qui concerne l'équité, la gestion de la mémoire dépend entièrement du fournisseur de langage.Gardez à l'esprit que les tables ont plus de méthodes que de matrices.J'aurais formulé vos premières questions comme suit : "Ce changement de performance est-il prévu entre 1 million et 10 millions ?" De plus, je suppose simplement qu'après 1 million de lignes, JMP pourrait effectuer une compression de stockage, en d'autres termes économiser de la mémoire, le compromis étant le temps.
Ce que je préfère dépend de la tâche. Si je fais une simulation, où une méthode est appliquée plusieurs fois et que j'obtiens des performances sommaires, j'utiliserai une matrice.Avant JMP 13, qui a un meilleur référencement des sous-tables, si j'avais de grandes tables, je travaillais avec des matrices, puis je définissais les valeurs de la table spécifiquement pour les performances, et je le ferais jamais utiliser des formules pour les grands tableaux.
J'ai joint un script qui ajoute à votre script une troisième méthode qui utilise la syntaxe de référencement de sous-table JMP 13. L'extrait ci-dessous est la syntaxe de la colonne Ajouter. [Ce site ne me permettrait pas de publier la pièce jointe, alors allez à la fin pour voir le script de remplissage.]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
Remarque puisque vous êtes intéressé par les performances, essayez ceci,
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);
Pour a<7, la deuxième méthode est bien supérieure à la méthode 1.
a = 6 : te1 - tb1 = 2,43333333334886 ; te2 - tb2 = 0,25 ; //seconde méthode supérieure
a = 7 : te1 - tb1 = 2,48333333339542 ; te2 - tb2 = 2,56666666665114 ; //les deux méthodes sont identiques
a = 8 : te1 - tb1 = 3,03333333344199 ; te2 - tb2 = 25,8166666666511 ; // deuxième méthode bien pire
Et comme vous quand il y a une grande différence, j'envoie une note à JMP pour info.
Pour les personnes exécutant le script, méfiez-vous qu'il ferme toutes les tables, etc. Exécutez dans une nouvelle session de 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");