Scripts et très gros fichiersJ'ai un script qui importe de nombreux fichiers et les concatène.
Ce fichier peut être> 41 millions de lignes et être dans les 10 Gigabits (j'ai 100 Go d'espace libre et 128 Go de mémoire : Utilisation de JMP16.2)
J'ai ensuite des scripts pour sélectionner des lignes et des colonnes, etc.Ma question ne concerne vraiment pas les scripts en soi, mais pourquoi si j'exécute chaque script dans l'ordre plutôt que d'avoir un script qui inclut tous les scripts, JMP "se bloque".
Par exemple, Tout semble fonctionner dans la mesure où si j'exécute chaque JSL dans l'ordre, cela fonctionne
1. Concat_files.JSL
2. Change_Test_Instance_Name.JSL
3. Summarize_Test_Instance.JSL
vs
un script qui exécute chacun des éléments ci-dessus pour moi...
Par exemple,
Run_all_scripts.JSL
include("ADDIN_HOME(my_scripts)\Concat_files.jsl");
include(("ADDIN_HOME(my_scripts)\Change_Test_Instance_Name.JSL");
include("ADDIN_HOME(my_scripts)\Summarize_Test_Instance.JSL.jsl");
Cela ne fait que bloquer mon système....J'ai le journal ouvert et je peux dire qu'il est bloqué dans le script suivant (le journal affiche une instruction show comme show("Entering Change_Test_Instance name");
J'ai essayé d'utiliser wait(); instructions entre chaque include (et dans chacun des scripts), mais cela ne fonctionne toujours pas.Y a-t-il autre chose que je devrais essayer ?
Tableau de donnéesAutreScriptRe : Scripts et fichiers très volumineuxOuvrez-vous/fermez-vous des fenêtres de rapport, 100s ou 1000s peut-être ? Ne pas ouvrir les fenêtres du tout pourrait aider, beaucoup. (Peut-être que le système d'exploitation n'a pas la possibilité de nettoyer quelque chose.)
Imprimez-vous des milliers de lignes dans le journal JMP 16 ? Il existe une préférence pour utiliser l'ancien format de journal qui pourrait aider.
Le gestionnaire de tâches pourrait fournir un aperçu. Regardez les poignées et les objets GDI ainsi que les coupables évidents de la mémoire et du disque.
Ou vérifiez le voyant du disque à l'avant de l'ordinateur, si vous en avez un. Il ne semble pas que vous devriez paginer, c'est un bel ordinateur !
J'aimerais savoir ce qui se passait lorsque vous obtenez une réponse; si rien de ce qui précède ne vous aide, le support technique peut également vous aider.
Re : Scripts et fichiers très volumineuxJ'ai laissé le script s'exécuter pour voir s'il était bloqué (il semble qu'il fonctionnait, mais cela prend des heures, pas des minutes lors de l'exécution dans un script).
Je n'ai que des instructions show dans le journal.
Voici la sortie du journal pour l'exécution de scripts dans un script.(Le "passage à une instance de test" prend 3,65 heures contre 3,65 minutes si j'exécute moi-même le même script sur le même fichier).Le processeur exécutait 12 cœurs (CPU0 à CPU11) à environ 20 % pendant les 3,65 heures
Voici le(s) journal(s) et un extrait du JSL ci-dessous.
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 j'exécute le script d'instance de test de réduction par lui-même avec le même fichier volumineux, voici le journal
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;
Les bases de ce script sont de trouver des noms qui commencent par "Char_Char" et de les changer pour qu'ils n'aient pas "Char_Char" ; Pour ce faire, créez un tableau récapitulatif, sélectionnez les lignes du tableau récapitulatif contenant "Char_Char", récupérez les lignes du tableau principal qui sont sélectionnées, puis modifiez le nom dans le tableau principal.Voici un extrait du script lent.
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 : Scripts et fichiers très volumineuxOn dirait que j'ai collé le même journal....
Voici quand Courir seul...200 s ou environ 3,33 minutes
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 : Scripts et fichiers très volumineuxVous pourrez peut-être exécuter le code avec le débogueur/profileur JSL, ou simplement l'instrumenter avec un time_start..time_end plus fin comme vous le faites. Je suppose que le code a un comportement N ^ 2 (temps 4X pour doubler les données) pour une raison quelconque avec les inclusions. Peut-être un problème d'espace de noms avec un nom qui entre en collision avec un nom dans la table de données.
Un endroit qui pourrait être mauvais est
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
mais il est difficile de le savoir sans le chronométrer. Si Test_names pouvait avoir 1e6 éléments et dt_summary pouvait avoir 1e6 lignes, en moyenne 500 000 test_names seraient examinés sur chacune des 1e6 lignes. Ou peut-être qu'il n'y en a qu'une dizaine et que ce n'est pas un problème. Vous voudrez peut-être le réécrire, à peu près comme ceci
// 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>
Le tableau associatif sera beaucoup plus rapide si la liste comporte plusieurs centaines d'éléments.
Si vous voulez utiliser le profileur JSL, ne faites pas les 3 heures pour votre première expérience de profilage. Essayez un petit programme, en utilisant un include, et assurez-vous de jouer avec ces boutons :
Quelque chose dans la boîte à outils
Une nouvelle fenêtre s'ouvre, l'horloge sert à chronométrer JSL.
L'info-bulle de l'icône indique "exécuter le profileur".
vous pourrez peut-être utiliser le bouton de pause bleu ou attendre qu'il se termine, puis examinez les points chauds :
onglets pour les sources
onglets pour les sources