Todos,
Me pregunto si alguien ha hecho rutas similares a la matriz de tiempo frente a la tabla de datos.
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);


Hacer que la tabla de datos sea privada podría ahorrar algo más de tiempo, pero en general, ¿es esto justo o alguien favorece un contenedor de datos sobre otro únicamente por la velocidad?
@gzmorgan0 ,
Gracias por su respuesta detallada. Su interpretación es en su mayoría precisa y desearía haber proporcionado más claridad para empezar. Estoy de acuerdo y comparto sus preferencias entre tablas de datos y matrices, usaría tablas de datos si necesitara más métodos integrados que matrices. Sin embargo, la pregunta que quería plantear a las comunidades era la velocidad de manejo de grandes datos y si el comportamiento cambia a medida que aumenta el tamaño de los datos y por qué. Me gustaría creer que se debe a la compresión de almacenamiento a la que te refieres.
Un aspecto interesante es la cantidad de tiempo que se ahorra a través de subguiones de tablas de datos. Con a = 7, estaba reduciendo unos buenos 7 segundos en comparación con el enfoque de fórmula de columna tradicional, con matrices que aún lideran en términos de rendimiento.
Tienes 2 preguntas: ¿es esto justo? y prefieres uno sobre otro?
En cuanto a la feria, la gestión de la memoria depende del proveedor del idioma.Tenga en cuenta que las tablas tienen más métodos que matrices.Habría formulado sus primeras preguntas como: "¿Se espera este cambio en el rendimiento entre 1 millón y 10 millones?" Además, solo supongo que después de 1 millón de filas, JMP podría estar haciendo algo de compresión de almacenamiento, en otras palabras, ahorrando memoria, la compensación es el tiempo.
Lo que prefiero depende de la tarea. Si estoy haciendo una simulación, donde un método se aplica varias veces y obtengo un rendimiento resumido, entonces usaré una matriz.Antes de JMP 13, que tiene una mejor referenciación de subtablas, si tenía tablas grandes, trabajaba con matrices y luego establecía los valores en la tabla específicamente para el rendimiento, y nunca utilice fórmulas para tablas grandes.
Adjunté una secuencia de comandos que agrega a su secuencia de comandos un tercer método que utiliza la sintaxis de referencia de subtabla JMP 13. El fragmento a continuación es la sintaxis de la columna Agregar. [Este sitio no me permitiría publicar el archivo adjunto, así que vaya al final para ver el script de relleno.]
dt1[0, "Add"] = dt1[0,"Random-1"]+ dt1[0,"Random-2"] ;
Tenga en cuenta que, dado que está interesado en el rendimiento, intente esto,
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);
Para a<7, el segundo método es muy superior al método 1.
a = 6: te1 - tb1 = 2,43333333334886; te2 - tb2 = 0,25; //segundo metodo superior
a = 7: te1 - tb1 = 2,48333333339542; te2 - tb2 = 2,56666666665114; //ambos metodos son iguales
a = 8: te1 - tb1 = 3,03333333344199; te2 - tb2 = 25,8166666666511; //segundo método mucho peor
Y como tú, cuando hay una gran diferencia, envío una nota a JMP como FYI.
Para las personas que ejecutan el script, tenga en cuenta que está cerrando todas las tablas, etc. Ejecute una nueva sesión 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");