Tutto,
Mi chiedo se qualcuno abbia fatto percorsi simili alla matrice temporale rispetto alla tabella dei dati.
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);


Rendere privata la tabella dei dati potrebbe far risparmiare un po' più di tempo, ma in generale, è giusto o qualcuno preferisce un contenitore di dati rispetto a un altro solo per la velocità?
@gzmorgan0 ,
Grazie per la tua risposta dettagliata. La tua interpretazione è per lo più accurata e vorrei aver fornito maggiore chiarezza per cominciare. Sono d'accordo e condivido le tue preferenze tra tabelle di dati e matrici, userei le tabelle di dati se avessi bisogno di più metodi integrati rispetto alle matrici. Tuttavia, la domanda su cui volevo raccogliere il cervello delle comunità era la velocità di gestione di dati di grandi dimensioni e se e perché il comportamento cambia con l'aumentare delle dimensioni dei dati. Mi piacerebbe credere che sia a causa della compressione della memoria a cui ti riferisci.
Un aspetto interessante è la quantità di tempo risparmiata tramite il sub-scripting della tabella dati. A a = 7, si stava riducendo di ben 7 secondi rispetto all'approccio tradizionale della formula della colonna, con le matrici ancora leader in termini di prestazioni.
Hai 2 domande: è giusto? e preferisci l'uno all'altro?
Per quanto riguarda l'onestà, la gestione della memoria spetta al fornitore del linguaggio.Tieni presente che le tabelle hanno più metodi delle matrici.Avrei formulato le tue prime domande come: "È previsto questo cambiamento di preformance tra 1 milione e 10 milioni?" Inoltre, sto solo supponendo che dopo 1 milione di righe, JMP potrebbe eseguire una compressione dell'archiviazione, in altre parole risparmiando memoria, il compromesso è il tempo.
Ciò che preferisco dipende dal compito. Se sto eseguendo una simulazione, in cui un metodo viene applicato numerose volte e ottengo prestazioni di riepilogo, utilizzerò una matrice.Prima di JMP 13, che ha un migliore riferimento alle sottotabelle, se avessi tabelle di grandi dimensioni, lavorerei con le matrici, quindi imposterei i valori sulla tabella in modo specifico per le prestazioni e lo farei Mai utilizzare formule per tabelle di grandi dimensioni.
Ho allegato uno script che aggiunge allo script un terzo metodo che utilizza la sintassi di riferimento alla sottotabella di JMP 13. Lo snippet seguente è la sintassi per la colonna Aggiungi. [Questo sito non mi consente di pubblicare l'allegato, quindi vai alla fine per vedere lo script di riempimento.]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
Nota poiché sei interessato alle prestazioni, prova questo,
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);
Per a<7, il secondo metodo è di gran lunga superiore al metodo 1.
a = 6: te1 - tb1 = 2,43333333334886; te2 - tb2 = 0,25; //secondo metodo superiore
a = 7: te1 - tb1 = 2,48333333339542; te2 - tb2 = 2,56666666665114; //entrambi i metodi uguali
a = 8: te1 - tb1 = 3,03333333344199; te2 - tb2 = 25,8166666666511; //secondo metodo molto peggio
E come te quando c'è una grande differenza, invio una nota a JMP come FYI.
Per le persone che eseguono lo script, attenzione che sta chiudendo tutte le tabelle, ecc. Esegui in una nuova sessione di 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");