Atomischer BetriebHallo.
Ich versuche, die abgelaufene Zeit dieses Filters zu messen (berechnet den gleitenden 10-Sekunden-Durchschnitt für die Spalte "PowerRail"):
...
tStart = HP Time();
new_col << Formula( Summation( i = 1,10,Lag(dt:PowerRail,i))/10);
tStop = HP Time();
...
Es scheint, dass anstelle eines linearen Fortschritts ein neuer Thread aufgerufen wird und die tatsächliche Zeit zum Abschließen der Operation nicht realisiert wird.
Wie es aussieht, werden 200 uS gemessen, was nicht realistisch ist. Die CSV-Datei mit der Spalte "PowerRail" hat eine Größe von 11 GB. 200 uS ist wahrscheinlicher die Zeit, um den neuen Thread aufzurufen.
Am Ende der Skripts wird die JMP-Tabelle geöffnet und die gleitenden Durchschnittswerte werden im sichtbaren Bereich der Tabelle angezeigt. Wenn ich jedoch nach unten scrolle, sehe ich, dass die Formel die Verarbeitung der gesamten Spalte nicht wirklich abgeschlossen hat.
Ist es möglich, die Formel in einer atomaren Operation auszuführen, dh nicht in einem anderen Thread, so dass die tatsächlich zu fertigende Zeit gemessen wird?
Danke im Voraus.
Re: Atomische OperationDies ist nur eine FYI, wenn Sie die Leistung interaktiv betrachten. Führen Sie das Skript mit dem JMP-Debugger aus und wählen Sie die Schaltfläche aus, die wie eine Uhr über einem Nummernzeichen # aussieht. Es gibt den Prozentsatz der Zeit im Schritt oder die Anzahl der "Schritte" zurück, um die Berechnungen abzuschließen. Nachfolgend finden Sie das Skript, die Zeitunterschiede und die Leistung des Debuggers. Es scheint, dass die Funktion Col Moving Average () die am besten bewertete Methode ist.
Names default to here(1);
dt = New Table("Test", New Column("random", numeric), New Column("MA1", numeric),
New Column("MA2", numeric),
New Column("MA3", numeric),
);
dt << add rows(2000000);
xmat = J(2000000, 2, Random Integer(1,10));
dt:random << Set values(xmat[0,1]);
wait(5);
t1 = HP Time();
dt:MA1 << Formula( Summation( i = 1,10,Lag(dt:random,i))/10, <<RUN formula=""></RUN>Hier sind die numerischen Ergebnisse:
t4 - t3 = 166; // Verwenden von Col Moving Average
t3 - t2 = 2246576; // Verwenden einer For-Schleife
t2 - t1 = 1038; // Verwenden Sie die Formel der Summation geteilt durch 10
Hier ist der Screenshot des Debugger-Leistungsberichts

Re: Atomische Operationich h,
Vielen Dank für Ihre schnelle Antwort.
Mit 'Run Formulas ()' dauert der Filter tatsächlich 4 Stunden!
Re: Atomische OperationSie haben Recht, dass das Skript fortgesetzt wird, bevor die Formel tatsächlich ausgewertet wird. Normalerweise wird dies bevorzugt, da andernfalls Ihre Skripte für immer laufen müssen. Sie können das Skript mit Run Formulas warten lassen:
Names default to here( 1 );
//Open sample data and create a column to modify
dt = Open("$Sample_Data/iris.jmp");
new_col = dt << New Column("Test",Numeric,"Continuous",Formula(1));
//Set the column formula
tStart = HP Time();
new_col << Formula( for(i=1,i<=100000, i++, i+1) );
tMiddle = HP Time();
print(tMiddle-tStart);
//Wait for the formula to finish calculating
dt << Run Formulas();
tStop = HP Time();
print(tStop-tStart);