Scripting und sehr große DateienIch habe ein Skript, das viele Dateien importiert und verkettet.
Diese Datei kann mehr als 41 Millionen Zeilen umfassen und im Zehn-Gigabit-Bereich liegen (ich habe 100 GB freien Speicherplatz und 128 GB Speicher: Mit JMP16.2)
Ich habe dann Skripte zum Auswählen von Zeilen und Spalten und dergleichen.Meine Frage betrifft eigentlich nicht das Skripting an sich, sondern warum JMP „hängt“, wenn ich jedes Skript der Reihe nach ausführe, anstatt ein Skript zu haben, das alle Skripte enthält.
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 Dinge 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 bringt mein System einfach zum Stillstand...Ich habe das Protokoll geöffnet und kann feststellen, dass es im nächsten Skript hängen bleibt (Das Protokoll zeigt eine Show-Anweisung wie show("Entering Change_Test_Instance name");
Ich habe versucht, wait(); Anweisungen zwischen jedem Include (und in jedem der Skripte) einfügen, aber das funktioniert immer noch nicht.Gibt es noch etwas, das ich versuchen sollte?
Automatisierung und SkripterstellungBetreff: Scripting und sehr große DateienEntschuldigung für die späte Antwort (mit der Arbeit beschäftigt).
Danke für die Ideen.Ich habe den Debugger noch nie verwendet.
Ich werde mir auch die Namespace-Idee ansehen.Ich habe auch festgestellt, dass, wenn ich den Haupt-DT geöffnet habe (er wurde verkettet) und dann das Skript mit der Include-Anweisung ausführe, es auch genauso schnell ausgeführt wird, als wenn ich das Skript unverändert ausführe (kein Include).Es gibt also etwas darüber, dass die Hauptdatentabelle für eine Weile im Speicher bleibt, statt dass sie verkettet und dann sofort das Include-Skript ausgeführt wird.
Betreff: Scripting und sehr große DateienMöglicherweise können Sie den Code mit dem JSL-Debugger/Profiler ausführen oder ihn einfach mit den feineren time_start..time_end-Funktionen instrumentieren, wie Sie es tun. Ich vermute, dass der Code aus irgendeinem Grund mit den Includes ein N^2-Verhalten (4-fache Zeit für die Verdoppelung der Daten) aufweist. Möglicherweise liegt ein Namespace-Problem mit einem Namen vor, 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 zeitlich festzulegen. Wenn Test_names 1e6-Elemente und dt_summary 1e6-Zeilen haben könnten, würden durchschnittlich 500.000 test_names in jeder der 1e6-Zeilen untersucht. Oder vielleicht sind es nur etwa 10 und das ist kein Problem. Vielleicht möchten Sie es ungefähr so umschreiben
// 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, sollten Sie für Ihr erstes Profiling-Erlebnis nicht den dreistündigen Lauf absolvieren. Versuchen Sie es mit einem kleinen Programm, das ein Include verwendet, und stellen Sie sicher, dass Sie mit diesen Schaltflächen spielen:
Something in the toolboxSomething in the toolboxEtwas im Werkzeugkasten
A new window opens, the clock is for timing JSL.A new window opens, the clock is for timing JSL.Es öffnet sich ein neues Fenster, die Uhr dient zum Timing von JSL.
The tooltip for the icon says "run profiler".The tooltip for the icon says "run profiler".Der Tooltip für das Symbol lautet „Profiler ausführen“.
Möglicherweise können Sie die blaue Pause-Taste verwenden oder warten, bis die Pause beendet ist, und dann die Hotspots untersuchen:
tabs for sourcestabs for sourcesRegisterkarten für Quellen
tabs for sourcestabs for sources Registerkarten für Quellen
Betreff: Scripting und sehr große DateienSieht so aus, als hätte ich das gleiche Protokoll eingefügt....
Hier ist, wenn man alleine läuft...200 Sekunden 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;
Betreff: Scripting und sehr große DateienIch habe das Skript laufen lassen, um zu sehen, ob es hängen geblieben ist (anscheinend wurde es ausgeführt, aber es dauert Stunden, nicht Minuten, wenn es innerhalb eines Skripts ausgeführt wird).
Ich habe nur Show-Anweisungen im Protokoll.
Hier ist die Protokollausgabe für die Ausführung von Skripten innerhalb eines Skripts.(Der „Wechsel zu einer Testinstanz“ dauert 3,65 Stunden gegenüber 3,65 Minuten, wenn ich dasselbe Skript selbst für dieselbe Datei ausführe.)Die CPU betrieb 12 Kerne (CPU0 bis CPU11) etwa 20 % für die 3,65 Stunden
Hier sind die Protokolle 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. Dazu erstellen Sie eine Übersichtstabelle, wählen die Zeilen in der Übersichtstabelle aus, die „Char_Char“ haben, rufen die ausgewählten Zeilen in der Haupttabelle ab und ändern 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();Betreff: Scripting und sehr große DateienÖffnen/schließen Sie Berichtsfenster, vielleicht 100er oder 1000er? Es könnte sehr hilfreich sein, die Fenster überhaupt nicht zu öffnen. (Möglicherweise hat das Betriebssystem keine Chance, etwas zu bereinigen.)
Drucken Sie Tausende von Zeilen in das JMP 16-Protokoll? Es gibt eine Voreinstellung, das alte Protokollformat zu verwenden, was hilfreich sein könnte.
Der Task-Manager könnte einen Einblick geben. Schauen Sie sich Handles und GDI-Objekte sowie die offensichtlichen Speicher- und Festplatten-Übeltäter an.
Oder überprüfen Sie die Festplattenleuchte an der Vorderseite des Computers, falls Sie eine haben. Es hört sich nicht so an, als ob Sie paginieren sollten, das ist ein schöner Computer!
Ich würde gerne wissen, was passiert ist, wenn Sie eine Antwort erhalten. Wenn nichts oben Genanntes hilft, kann auch der technische Support helfen.