Alle,
Ich frage mich, ob jemand ähnliche Trails zur Zeitmatrix vs. Datentabelle erstellt hat.
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);


Wenn Sie die Datentabelle privat machen, sparen Sie möglicherweise etwas mehr Zeit, aber ist das im Allgemeinen fair oder bevorzugt jemand einen Datencontainer nur aus Geschwindigkeitsgründen gegenüber einem anderen?
@gzmorgan0 ,
Vielen Dank für Ihre ausführliche Antwort. Ihre Interpretation ist größtenteils zutreffend und ich wünschte, ich hätte von Anfang an mehr Klarheit geschaffen. Ich stimme zu und teile Ihre Präferenzen zwischen Datentabellen und Matrizen. Ich würde Datentabellen verwenden, wenn ich mehr integrierte Methoden als Matrizen benötigen würde. Die Frage, die ich den Communitys stellen wollte, war jedoch die Geschwindigkeit beim Umgang mit großen Datenmengen und ob und warum sich das Verhalten ändert, wenn die Datengröße zunimmt. Ich würde gerne glauben, dass es an der Speicherkomprimierung liegt, auf die Sie sich beziehen.
Ein interessanter Aspekt ist die Zeitersparnis durch die Subskription von Datentabellen. Bei a = 7 wurden im Vergleich zum herkömmlichen Spaltenformelansatz gute 7 Sekunden eingespart – wobei Matrizen in Bezug auf die Leistung immer noch führend sind.
Sie haben zwei Fragen: Ist das fair? Und bevorzugst du den einen gegenüber dem anderen?
Was Fair betrifft, liegt die Speicherverwaltung ganz beim Sprachanbieter.Bedenken Sie, dass Tabellen über mehr Methoden als Matrizen verfügen.Ich hätte Ihre ersten Fragen so formuliert: „Ist diese Leistungsveränderung zwischen 1 und 10 Millionen zu erwarten?“ Außerdem vermute ich nur, dass JMP nach 1 Million Zeilen möglicherweise eine gewisse Speicherkomprimierung durchführt, also Speicher spart, wobei der Kompromiss Zeit ist.
Was ich bevorzuge, hängt von der Aufgabe ab. Wenn ich eine Simulation durchführe, bei der eine Methode mehrmals angewendet wird und ich eine zusammenfassende Leistung erhalte, verwende ich eine Matrix.Vor JMP 13, das über eine bessere Untertabellenreferenzierung verfügt, habe ich bei großen Tabellen mit Matrizen gearbeitet und dann die Werte speziell für die Leistung auf die Tabelle festgelegt, und das habe ich auch getan niemals Verwenden Sie Formeln für große Tabellen.
Ich habe ein Skript angehängt, das Ihrem Skript eine dritte Methode hinzufügt, die die JMP 13-Syntax für die Untertabellenreferenzierung verwendet. Der folgende Ausschnitt ist die Syntax für die Spalte „Hinzufügen“. [Diese Website erlaubt mir nicht, den Anhang zu posten. Gehen Sie also zum Ende, um das Füllskript zu sehen.]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
Beachten Sie, dass Sie Folgendes versuchen sollten, da Sie an der Leistung interessiert sind:
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);
Für a<7 ist die zweite Methode der Methode 1 weit überlegen.
a = 6: te1 - tb1 = 2,43333333334886; te2 - tb2 = 0,25; //zweite Methode überlegen
a = 7: te1 - tb1 = 2,48333333339542; te2 - tb2 = 2,56666666665114; //beide Methoden gleich
a = 8: te1 - tb1 = 3,03333333344199; te2 - tb2 = 25,8166666666511; //zweite Methode viel schlimmer
Und wie Sie, wenn es einen großen Unterschied gibt, sende ich zu Ihrer Information eine Nachricht an JMP.
Benutzer, die das Skript ausführen, sollten darauf achten, dass dadurch alle Tabellen usw. geschlossen werden. Führen Sie eine neue JMP-Sitzung aus.
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");