Scripting und sehr große DateienIch habe ein Skript, das viele Dateien importiert und sie verkettet.
Diese Datei kann >41 Millionen Zeilen umfassen und in den Zehner-Gigabits liegen (ich habe Hunderte von GB freiem Speicherplatz und 128 GB Arbeitsspeicher: Verwendung von JMP16.2)
Ich habe dann Skripte, um Zeilen und Spalten und so auszuwählen.Meine Frage bezieht sich wirklich nicht auf das Skripting an sich, aber warum, wenn ich jedes Skript der Reihe nach ausführe, anstatt ein Skript zu haben, das alle Skripts enthält, "hängt" JMP?
Z.B, Alles scheint zu funktionieren, wenn ich jede JSL der Reihe nach ausführe, funktioniert es
1. Concat_files.JSL
2. Change_Test_Instance_Name.JSL
3. Summarize_Test_Instance.JSL
vs
ein Skript, das jedes der oben genannten für mich ausführt ...
Z.B,
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");
Das hängt mein System einfach auf....Ich habe das Protokoll geöffnet und kann feststellen, dass es im nächsten Skript hängen bleibt (Protokoll zeigt eine Show-Anweisung wie show("Entering Change_Test_Instance name");
Ich habe versucht, wait(); -Anweisungen zwischen jedem Include (und innerhalb jedes Skripts), aber das funktioniert immer noch nicht.Gibt es noch etwas, das ich versuchen sollte?
DatentabelleAndereSkripterstellungRe: Scripting und sehr große DateienÖffnen/schließen Sie Berichtsfenster, vielleicht 100er oder 1000er? Die Fenster überhaupt nicht zu öffnen, könnte sehr hilfreich sein. (Möglicherweise hat das Betriebssystem keine Chance, etwas zu bereinigen.)
Drucken Sie Tausende von Zeilen in das JMP 16-Protokoll? Es gibt eine Einstellung zur Verwendung des alten Protokollformats, die hilfreich sein könnte.
Der Task-Manager könnte einen Einblick geben. Sehen Sie sich Handles und GDI-Objekte sowie die offensichtlichen Schuldigen an Speicher und Festplatte an.
Oder überprüfen Sie die Festplatten-LED an der Vorderseite des Computers, falls vorhanden. Es hört sich nicht so an, als ob Sie Pagen sollten, das ist ein netter Computer!
Ich würde gerne wissen, was passiert ist, wenn Sie eine Antwort erhalten; Wenn nichts oben genanntes hilft, kann der technische Support auch helfen.
Re: Scripting und sehr große DateienIch habe das Skript ausgeführt, um zu sehen, ob es hängen geblieben ist (es scheint, als ob es ausgeführt wurde, aber es dauert Stunden, nicht Minuten, wenn es innerhalb eines Skripts ausgeführt wird).
Ich habe nur Show-Anweisungen im Log.
Hier ist die Protokollausgabe für die Ausführung von Skripts innerhalb eines Skripts.(Das "Wechseln zu einer Testinstanz" dauert 3,65 Stunden gegenüber 3,65 Minuten, wenn ich dasselbe Skript selbst auf derselben Datei ausführe).Die CPU lief mit 12 Kernen (CPU0 bis CPU11) etwa 20 % für die 3,65 Stunden
Hier ist das/die Protokoll(e) und ein Ausschnitt der JSL unten.
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;
Wenn ich das Skript zum Reduzieren der Testinstanz alleine mit derselben großen Datei ausführe, ist hier das Protokoll
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;
Die Grundlagen dieses Skripts bestehen darin, Namen zu finden, die mit "Char_Char" beginnen, und sie so zu ändern, dass sie kein "Char_Char" enthalten. Erstellen Sie dazu eine Übersichtstabelle, wählen Sie die Zeilen in der Übersichtstabelle aus, die "Char_Char" enthalten, rufen Sie die Zeilen in der Haupttabelle ab, die ausgewählt sind, und ändern Sie dann den Namen in der Haupttabelle.Hier ist ein Ausschnitt aus dem langsamen Skript.
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 und sehr große DateienSieht so aus, als hätte ich dasselbe Protokoll eingefügt....
Hier ist, wenn ich alleine laufe...200s oder etwa 3,33 Minuten
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 und sehr große DateienMöglicherweise können Sie den Code mit dem JSL-Debugger/Profiler ausführen oder ihn einfach mit einem feineren time_start..time_end instrumentieren, wie Sie es tun. Meine Vermutung ist, dass der Code aus irgendeinem Grund mit den Includes ein N ^ 2-Verhalten (4-fache Zeit zum Verdoppeln der Daten) aufweist. Möglicherweise ein Namespace-Problem mit einem Namen, der mit einem Namen in der Datentabelle kollidiert.
Ein Ort, der schlecht sein könnte, ist
dt_summary << select where( Contains( Test_names, :Test_Instance ) );
aber es ist schwer zu wissen, ohne es zu messen. Wenn Test_names 1e6-Elemente und dt_summary 1e6-Zeilen haben könnte, würden durchschnittlich 500.000 test_names in jeder der 1e6-Zeilen untersucht werden. Oder vielleicht gibt es nur 10 oder so und es ist kein Problem. Vielleicht möchten Sie es umschreiben, ungefähr so
// 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>
Das assoziative Array ist viel schneller, wenn die Liste mehrere hundert Elemente enthält.
Wenn Sie den JSL-Profiler verwenden möchten, machen Sie nicht den 3-stündigen Lauf für Ihre erste Profiling-Erfahrung. Probieren Sie ein kleines Programm mit einem Include aus und stellen Sie sicher, dass Sie mit diesen Schaltflächen spielen:
Etwas in der Werkzeugkiste
Ein neues Fenster öffnet sich, die Uhr dient der Zeitmessung von JSL.
Der Tooltip für das Symbol sagt "Profiler ausführen".
Möglicherweise können Sie die blaue Pause-Taste verwenden oder auf das Ende warten und dann die Hotspots untersuchen:
Registerkarten für Quellen
Registerkarten für Quellen