Hola comunidad de JMP,
En mis scripts JSL, a menudo genero nuevas columnas una tras otra de esta manera:
...
DT << New Column( "Some Name1", Numeric, "Continuous", Formula( Some Formula1 ) );
DT << New Column( "Some Name2", Numeric, "Continuous", Formula( Some Formula2 ) );
DT << New Column( "Some Name3", Numeric, "Continuous", Formula( Some Formula3 ) );
...
Normalmente, mis tablas de datos son bastante grandes y pueden llegar a tener 100 millones de filas. Las fórmulas que utilizo suelen incluir funciones estadísticas como Media de columna() , Col Maximum(), etc., lo que las ralentiza progresivamente a medida que aumenta el número de filas. Es posible que algunas columnas nuevas dependan entre sí, pero por el momento supongamos que no es así.
Cuando mi script se evalúa, veo que JMP 19.1 utiliza solo entre el 3% y el 4% de mi CPU (16 núcleos, 32 subprocesos).
¿Es posible acelerar el cálculo, por ejemplo, mediante paralelización, pero sin crear subconjuntos ni tener que fusionar los resultados de los subconjuntos? ¿Puedo trabajar en paralelo con una misma tabla de datos usando JSL en JMP?
Si no es así, ¿cree que vale la pena intentar el enfoque de "cálculo de fórmula de subconjunto y fusión"?
Salud
Robar
Dependiendo de tus cálculos (y de si necesitas fórmulas o no), podrías crear una tabla resumen, realizar los cálculos allí y actualizarlos en tu tabla principal.
Existe una herramienta para gestionar la paralelización de matrices: Parallel Assign.
No estoy seguro de que esto realmente acelere las cosas a menos que estés creando muchas columnas nuevas a partir de un número reducido de columnas de entrada, y tengas limitaciones importantes en cuanto a las funciones que puedes utilizar.
Aquí tienes un ejemplo:
Names default to here(1);
dt = Open("$Sample_data/Pollen.jmp");
//first a simple demo of parallel assign to calculate column means
moutmeans = J(n col(dt), 1, .); //blank matrix that will be populated
mdata = dt << get as matrix; //input data as a matrix
Parallel Assign(
{ mdata = mdata }, //variables needed in the 'worker thread'
moutmeans[a, b] = mean(mdata[0,a]); //this fills in one cell
);
show(moutmeans); //col means are here
// Now for new columns
//mdata = mdata[1::2,0]; //a way to start small if you add show()
nrows = nrow(mdata);
cnames = dt << get column names(); //used to find position of columns in matrix
// Write formulas for each columns using column names as placeholders
// to be replaced by matrix values later, this would work for pretty simple logic
formulas = Eval List({
Expr(edge + nub + 10),
Eval Expr(nub - Expr( col mean(dt:nub) ) ) //note this col mean evaluates now
});
newcnames = {"a","b"}; //new column names used later
mout = J(nrows, length(formulas), .); //empty matrix to populate
Parallel Assign(
{
mdata = mdata,
formulas = formulas,
cnames = cnames
},
mout[a, b] = (
f = formulas[b];
//assign values to all potential variables used in matricies
//(bad idea if lots of unused columns)
for(i=1, i<= n items(cnames), i++,
//Make a list with the variable to assign and value to assign it to,
// then replace the list with assign
Eval( Substitute(
Eval List( {as name( name expr( cnames[i] ) ), mdata[a,i]} ),
Expr({}),
Expr( assign() )
) );
);
eval(f);
);
);
//put new columns in table
for each({c,i}, newcnames, dt << New Column(c,Numeric,Continuous, << Set Values(mout[0,i])));
//add columns to double check it worked
dt << New Column("a-check", Numeric, "Continuous", Format("Best", 12), Formula(:edge + :nub + 10));
dt << New Column("b-check", Numeric, "Continuous", Format("Best", 12), Formula(:nub - Col Mean(:nub)));
Podrías intentar suprimir la evaluación de fórmulas hasta que se hayan creado todas las columnas y luego usar Ejecutar fórmulas.
( @Ryan_Gilmore , @Robbbb ) dt<
Aquí hay un elemento de la lista de deseos para votar
evaluación de la fórmula de fondo