Scripting y archivos muy grandesTengo un script que importa muchos archivos y los concatena.
Este archivo puede tener> 41 millones de filas y estar en los 10 de Gigabits (tengo 100 GB de espacio libre y 128 GB de memoria: usando JMP16.2)
Luego tengo scripts para seleccionar filas y columnas y demás.Mi pregunta realmente no se trata de secuencias de comandos en sí, pero ¿por qué si ejecuto cada secuencia de comandos en orden en lugar de tener una secuencia de comandos que incluye todas las secuencias de comandos, JMP "se bloquea".
P.ej, Todo parece funcionar en el sentido de que si ejecuto cada JSL en orden, funciona
1. Concat_files.JSL
2. Change_Test_Instance_Name.JSL
3. Resumen_Prueba_Instancia.JSL
contra
un script que ejecuta cada uno de los anteriores para mí...
P.ej,
Ejecutar_todos_los_scripts.JSL
include("ADDIN_HOME(mis_scripts)\Concat_files.jsl");
include(("ADDIN_HOME(my_scripts)\Change_Test_Instance_Name.JSL");
include("ADDIN_HOME(my_scripts)\Summarize_Test_Instance.JSL.jsl");
Esto simplemente cuelga mi sistema....Tengo el registro abierto y me doy cuenta de que está atascado en el siguiente script (el registro muestra una instrucción show como show("Ingresando el nombre de Change_Test_Instance");
He intentado usar esperar(); declaraciones entre cada include (y dentro de cada uno de los scripts), pero eso todavía no funciona.¿Hay algo más que deba probar?
Tabla de datosOtrosecuencias de comandosRe: Scripting y archivos muy grandes¿Está abriendo/cerrando ventanas de informes, quizás 100 o 1000? No abrir las ventanas en absoluto podría ayudar, mucho. (Posiblemente, el sistema operativo no tiene la oportunidad de limpiar algo).
¿Está imprimiendo miles de líneas en el registro JMP 16? Hay una preferencia para usar el formato de registro anterior que podría ayudar.
El administrador de tareas podría proporcionar alguna información. Observe los identificadores y los objetos GDI, así como los culpables obvios de la memoria y el disco.
O verifique la luz del disco en la parte frontal de la computadora, si tiene una. No parece que debas estar paginando, ¡esa es una buena computadora!
Me gustaría saber qué estaba pasando cuando obtuviste una respuesta; si nada de lo anterior ayuda, el soporte técnico también puede ayudar.
Re: Scripting y archivos muy grandesDejé que el script se ejecutara para ver si estaba atascado (parece que se estaba ejecutando, pero toma horas, no minutos cuando se ejecuta dentro de un script).
Solo tengo declaraciones show en el registro.
Aquí está la salida de registro para ejecutar scripts dentro de un script.(El "cambio a una instancia de prueba" toma 3,65 horas frente a 3,65 minutos si ejecuto el mismo script en el mismo archivo).La CPU estaba ejecutando 12 núcleos (CPU0 a CPU11) alrededor del 20 % durante las 3,65 horas
Aquí están los registros y un fragmento del JSL a continuación.
N Items(files_open) = 12;
"Files are Concatenated ";
As Date(Today()) = 14Feb2022:13:00:32;
start_time - As Date(Today()) = -492;
"Saving Digital_shmoo_all";
As Date(Today()) = 14Feb2022:13:00:54;
"Done Saving Digital_shmoo_all";
As Date(Today()) = 14Feb2022:13:01:24;
"Changing to one test instance";
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 14Feb2022:13:01:39;
"Reducing Test Instances Ended";
As Date(Today()) = 14Feb2022:16:41:13;
start_time - As Date(Today()) = -13174;
"Transposing";
"File has been transposed";
As Date(Today()) = 14Feb2022:16:42:23;
start_time - As Date(Today()) = -69;
Si ejecuto el script de instancia de prueba de reducción solo con el mismo archivo grande, aquí está el registro
As Date(Today()) = 14Feb2022:13:01:24;
"Changing to one test instance";
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 14Feb2022:13:01:39;
"Reducing Test Instances Ended";
As Date(Today()) = 14Feb2022:16:41:13;
start_time - As Date(Today()) = -13174;
"Transposing";
"File has been transposed";
As Date(Today()) = 14Feb2022:16:42:23;
start_time - As Date(Today()) = -69;
Lo básico de este script es encontrar nombres que comiencen con "Char_Char" y cambiarlos para que no tengan "Char_Char"; Hacer esto creando una tabla de resumen, seleccionando las filas en la tabla de resumen que tienen "Char_Char", obteniendo las filas en la tabla principal que están seleccionadas y luego cambiando el nombre en la tabla principal.Aquí hay un recorte del guión lento.
One_Test_Instance.JSL
dt = Current Data Table();
Names Default To Here( 1 );
Show( N Rows( dt ), "In Reduce_Test_Instance" );
Show( As Date( Today() ) );
start_time = As Date( Today() );
dt << clear select;
dt << clear column selection;
Wait();
Test_names = {};
dt << Summary(
Group( :Test_Instance ),
Freq( "None" ),
Weight( "None" ),
output table name( "Summary_of_Table" )
);
dt_summary = Current Data Table();
Wait();
For Each Row( Insert Into( Test_names, dt_summary:Test_Instance ) );
Wait();
For( i = N Items( Test_names ), i > 0, i--,
If( (!Contains( Test_names[i], "CHAR_char" )),
Remove From( Test_names, i )
)
);
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
Wait();
aa = dt << get selected rows; //Get selected rows in main table
Wait();
Close( dt_summary, nosave );
If( N Rows( aa ) > 0,
(dt:Test_instance[aa]) = "CHAR_char_meas_TI";
(dt:Setup[aa]) = "meas_TI"; //Change name in main table
);
dt << clear select;
dt << clear column selection;
Wait();Re: Scripting y archivos muy grandesParece que pegué el mismo registro...
Aquí es cuando Correr solo...200 s o alrededor de 3,33 minutos
N Rows(dt) = 41929065;
"In Reduce_Test_Instance";
As Date(Today()) = 15Feb2022:10:11:57;
"Reducing Test Instances Ended";
As Date(Today()) = 15Feb2022:10:15:17;
start_time - As Date(Today()) = -200;
Re: Scripting y archivos muy grandesEs posible que pueda ejecutar el código con el depurador/perfilador de JSL, o simplemente instrumentarlo con time_start..time_end de grano más fino como lo está haciendo. Supongo que el código tiene un comportamiento N ^ 2 (tiempo 4X para duplicar los datos) por alguna razón con las inclusiones. Tal vez un problema de espacio de nombres con algún nombre que colisiona con un nombre en la tabla de datos.
Un lugar que podría ser malo es
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
pero es difícil saberlo sin cronometrarlo. Si Test_names pudiera tener 1e6 elementos y dt_summary pudiera tener 1e6 filas, en promedio se examinarían 500.000 test_names en cada una de las 1e6 filas. O tal vez solo hay 10 o más y no es un problema. Es posible que desee reescribirlo, aproximadamente así
// untested. combine two loops and use an aa rather than a list for lookup
Test_names = AssociativeArray();
For Each Row(
If( ( Contains( dt_summary:Test_Instance, "CHAR_char" )),
Test_names[ dt_summary:Test_Instance ] = 1
)
);
dt_summary << select where( Test_names<<CONTAINS></CONTAINS>
La matriz asociativa será mucho más rápida si la lista tiene varios cientos de elementos.
Si desea utilizar el generador de perfiles JSL, no realice la ejecución de 3 horas para su primera experiencia de generación de perfiles. Pruebe un programa pequeño, usando un incluir, y asegúrese de jugar con estos botones:
Algo en la caja de herramientas
Se abre una nueva ventana, el reloj es para cronometrar JSL.
La información sobre herramientas para el icono dice "ejecutar perfilador".
es posible que pueda usar el botón azul de pausa o esperar a que termine, luego examine los puntos calientes:
pestañas para fuentes
pestañas para fuentes