Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Ich habe eine Datentabelle mit ungefähr 100.000 Zeilen und 2000 Spalten.Dutzende dieser Spalten enthalten Formeln.Wenn ich irgendwo eine Änderung vornehme, fällt mir auf, dass in der Statusleiste „##column_xyz wird ausgewertet“ angezeigt wird und jede Formel in der Datentabelle ausgewertet wird.Da es sich um eine ziemlich große Tabelle handelt und es viele Formeln gibt, dauert die Auswertung aller Formeln bis zu 60 Sekunden.Daher reagiere ich sehr empfindlich auf die Ausführung von Aktionen, die eine Formelauswertung auslösen, da die Benutzeroberfläche bis zum Abschluss nicht mehr reagiert, was sehr ärgerlich sein kann, wenn es unerwartet passiert.Andererseits möchte ich nicht ständig die „Formelauswertung unterdrücken“, weil ich das manchmal vergesse und die Daten nicht aktualisiert werden, wenn sie hätten sein sollen.
Für diese große Datentabelle habe ich also ein JSL-Skript, das mithilfe der Graph Builder-Plattform eine Reihe von Diagrammen generiert, einige lokale Datenfilter anwendet und eine selektive Hervorhebung der Daten durchführt.Der Zweck des Skripts besteht im Wesentlichen darin, Diagramme dynamisch zu generieren und sie zum Ausschneiden und Einfügen in eine E-Mail oder einen Bericht vorzubereiten.
Mir ist aufgefallen, dass die Ausführung dieses Skripts scheinbar lange dauert.Länger als es sollte.Die Benutzeroberfläche reagiert fast 60 Sekunden lang nicht, bevor die Diagramme endlich angezeigt werden.Ich habe einige Zeit damit verbracht herauszufinden, was in diesen 60 Sekunden passiert.Dann wurde mir klar, dass die Formelauswertung irgendwie durch dieses Skript ausgelöst wird.Dies war nicht sofort ersichtlich, da in der Statusleiste der Datentabelle nicht die normale Meldung „Wird ausgewertet“ angezeigt wird. Es bleibt leer, vermutlich weil die Auswertung durch ein Skript und nicht durch eine Benutzeraktion ausgelöst wird.Als ich das Skript ausführte, während das Skriptprotokollfenster geöffnet war, wurde in der Protokollstatusleiste „##Spalte_mit_Formel wird ausgewertet“ angezeigt.Die Protokollstatusleiste war bei dieser Nachricht eingefroren, obwohl die Dauer der Verzögerung mich vermuten lässt, dass tatsächlich jede Formelspalte in der Tabelle ausgewertet wurde.Und dann bestätigte ich, dass die Formelauswertung der Übeltäter war, indem ich „Formelauswertung unterdrücken“ für die gesamte Tabelle aktivierte und das Skript erneut ausführte – die Diagramme wurden fast sofort angezeigt.
Durch Versuch und Irrtum habe ich es auf eine Zeile im Skript eingegrenzt – ein „Select Where“ wird verwendet, um einige der Daten in den generierten Diagrammen hervorzuheben.Es sieht ungefähr so aus:
myDT << Select Where( :Name("##column_with_formula") == "value" );Ich fand das seltsam; Vielleicht hatte es etwas mit dem „Wo“-Teil zu tun.Also habe ich diese Zeile durch etwas Einfacheres ersetzt:
myDT << Select Rows( {1,3,5,7} );Sogar diese Zeile scheint hinter den Kulissen immer noch eine Formelbewertung auszulösen.Dann habe ich noch ein paar Experimente gemacht:
- Bei geöffnetem Task-Manager habe ich Formelauswertungen wie gewohnt ausgelöst (Wert in einer Spalte ändern).In der Statusleiste wurden Formeln angezeigt, die ausgewertet wurden, und sofort stieg meine CPU-Auslastung auf bis zu 30 % (ein CPU-Kern maximiert).
- Ich habe darauf gewartet, dass die Aktivität beendet wurde, und habe versucht, über die Benutzeroberfläche eine Zeile in der Datentabelle auszuwählen.Die Statusleiste hat sich nicht geändert; Es wurde immer noch „Bewertungen durchgeführt“ angezeigt.Aber der Task-Manager zeigte genau die gleiche CPU-Aktivität an, als ob eine Formelauswertung stattfinden würde.
- Ich habe „Formelauswertung unterdrücken“ für die Datentabelle aktiviert und eine andere Zeile in der Datentabelle ausgewählt.Die CPU-Auslastung stieg nicht an.
Zusammenfassend habe ich durch Experimente Folgendes gezeigt:
- JMP führt die Auswertung der Spaltenformel überflüssig aus; Grundlegende Interaktionen mit der Benutzeroberfläche führen dazu, dass Berechnungen im Hintergrund stattfinden, obwohl keine der Eingabedaten tatsächlich geändert wurden.
- JMP ist nicht transparent darüber, wann diese Formelauswertungen durchgeführt werden.In der Statusleiste wird manchmal eine Meldung angezeigt, aber meistens gibt es keinen Hinweis darauf, dass dies geschieht.Dies äußert sich häufig in Verzögerungen/Stottern/Reaktionslosigkeit der Benutzeroberfläche ohne ersichtlichen Grund.
- Es sieht so aus, als ob, wenn eine Spalte zur Auswertung ausgelöst wird, ALLE Spalten ausgewertet werden, unabhängig davon, ob sie dies benötigten oder nicht.
Bei kleineren Datensätzen und weniger, weniger komplexen Formeln scheint die übermäßige Formelauswertung kein Problem zu sein.Aber bei ausreichend komplexen Formeln und einem großen Datensatz wird dies wirklich zum Hindernis.In meinem Fall muss ich mich wohl daran gewöhnen, die Formelauswertung ständig unterdrückt zu lassen und Formeln nur manuell auszuwerten.Dies ist jedoch fehleranfällig, genau wie in Excel, wenn die Neuberechnung der Arbeitsmappe auf manuell eingestellt ist.Zumindest verfügt Excel über einen Abhängigkeitsbaum, der es ihm ermöglicht, nur die notwendigen Formeln für die geänderten Daten auszuwerten, und wenn der Benutzer die Formeln entsprechend gestaltet, kann die Berechnung mit minimalem Aufwand jederzeit im automatischen Modus belassen werden.Zugegebenermaßen bin ich mit JMP nicht so vertraut wie mit Excel, daher gibt es in JMP möglicherweise Möglichkeiten, damit umzugehen, die ich noch nicht gelernt habe.
Hat jemand Vorschläge, wie man eine große Anzahl komplexer Formeln verwalten kann, OHNE eval ständig zu unterdrücken?
Wie im Titel meines Beitrags angegeben, würde mich auch interessieren, WARUM eine Änderung der Zeilenauswahl eine Formelauswertung auslöst.Und warum sagt Ihnen JMP manchmal, dass es Formeln auswertet, und warum verbirgt es es manchmal?
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?@Chris_Rodrigues schrieb:
Das Überraschendste für mich war auch, dass das bloße Auswahl einer Zeile löste eine vollständige Neubewertung der Tabelle aus (wie durch die CPU-Auslastung und die Reaktionsfähigkeit der Benutzeroberfläche belegt).Wenn eine Formel durch das Ausschließen einer Zeile beeinträchtigt werden könnte, warum nicht die Auswertung auslösen, wenn der Benutzer tatsächlich schließt eine Zeile aus ?Ich denke, es ist theoretisch möglich, dass ein Benutzer eine Spaltenformel schreiben könnte, die vom aktuellen Status der Zeilenauswahl abhängt, aber das scheint mir ein seltener Grenzfall zu sein.
Das verwirrt mich auch. Warum unterscheidet Jmp nicht zwischen den Zeilenzuständen: ausgeschlossen Und ausgewählt ?
Auch wenn die RowState geändert wurde - es könnte eine spätere Prüfung erfolgen, ob die ausgeschlossen() Staaten haben sich geändert.
Ich bin einverstanden mit @Chris_Rodrigues - Die meisten Spaltenformeln werden verwendet Ausgeschlossen() und nicht Ausgewählt() .
[Allerdings diejenigen mit Ausgewählt() sind die coolsten
]
Klingt nicht nach einem Nischenproblem. Bei Beispieldaten mit 5–1000 Datenzeilen ist dies kein großes Problem.
Aber für größere Datensätze ein Benutzer, der verwendet Ausgeschlossen() in Spaltenformeln muss eine enorme Strafe zahlen!
Names Default to Here(1);
dt = new table("test", add rows(5),
New Column( "again"),
New Column( "excluded",
Formula(
:again[1] = 1;
Excluded();
),
));
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Nun, es ist schön, endlich zu hören, dass ich nicht der Einzige bin, der damit zu kämpfen hat.Fast vier Jahre später ist es immer noch nicht besser geworden.Es gibt alle möglichen seltsamen Situationen, die eine Formelauswertung für die gesamte Datentabelle auslösen, selbst wenn die Formelauswertung angeblich tabellenweit unterdrückt wird.Das Unterdrücken der Formelauswertung für einzelne Spalten ist nicht praktikabel, da es keine Möglichkeit gibt, Abhängigkeiten zu verarbeiten.Die Unterdrückung aller Spalten muss aufgehoben werden, damit JMP sie in der richtigen Reihenfolge auswerten kann.Außerdem scheint die Formelauswertungs-Engine in JMP16 sogar noch langsamer geworden zu sein.Die Auswertung meiner vollständigen Tabelle nimmt jetzt unverhältnismäßig viel Zeit in Anspruch.
Aufgrund dessen und der ständigen Vorschläge in diesen Foren, einfach alle Formeln zu löschen und nur feste Werte zu speichern, bin ich zu dem Schluss gekommen, dass JMP einfach nicht für die Verarbeitung dynamischer Formeln, sondern nur für statische Daten gedacht ist.Formeln sind zunächst schön, wenn Ihre Tabelle klein ist und sie immer noch ordnungsgemäß funktionieren. Wenn jedoch die Formelanzahl, die Formelkomplexität oder die Zeilenanzahl eine bestimmte Grenze überschreiten, stoßen Sie an eine Mauer.Ich muss dieses Projekt mit einem anderen Tool komplett überarbeiten und JMP nur für die grafische Darstellung/Präsentation/Statistik verwenden.
Ich werde das Problem als gelöst markieren.Die Lösung ist, dass es keine Lösung gibt.Wenn dieses Problem bei Ihnen auftritt, ist JMP nicht das richtige Tool für diese Aufgabe.Löschen Sie Ihre dynamischen Formeln und speichern Sie nur statische Daten.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Ich hatte ähnliche Probleme mit einer großen Datentabelle.
Immer wieder kam es zu Formelauswertungen.
Nach dem Speichern der Tabelle und dem erneuten Öffnen war alles in Ordnung.
Möglicherweise wurde die Neubewertung also durch einen Variablennamenkonflikt ausgelöst. Und das Problem war nach dem Zurücksetzen des Variablennamens behoben.
Wenn andere Benutzer ähnliche Probleme haben, besteht hier der Wunsch, einzelne Formeln schnell zu aktivieren und zu deaktivieren:
Schnelle Möglichkeit, Formelberechnungen zu aktivieren/deaktivieren
Eine andere Idee: Formelauswertungen standardmäßig deaktivieren – um einen reibungslosen JMP ohne solche falschen Formel-Neuauswertungen zu erhalten.
Wenn Sie der Datentabelle einige Daten hinzufügen, lösen Sie einfach eine einmalige Formelauswertung aus. Hier ist der Wunsch:
Schnelle Möglichkeit, eine einmalige Formelauswertung für eine bestimmte Formel auszulösen
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Diese Tabelle wurde nicht in einer alten Version von JMP erstellt.Es ist vielleicht ein Jahr alt, also war es entweder JMP 13 oder 14.
Ich habe das Menü mit dem roten Dreieck verwendet, um das Kontrollkästchen „Auswertung unterdrücken“ für die Tabelle zu aktivieren, dann habe ich es gespeichert und geschlossen.Beim erneuten Öffnen der Tabelle ist das Kontrollkästchen „Auswertung unterdrücken“ nicht mehr aktiviert, sodass die tabellenweite Einstellung beim Speichern der Tabelle offenbar nicht beibehalten wurde.Wenn die Tabelle geöffnet wird, wird in der Statusleiste sofort „xyz wird ausgewertet…“ angezeigt.Ich bin mir nicht sicher, was der Auslöser dafür ist.
Ich hatte ein OnOpen-Skript, das zum Auffüllen von Daten in einige assoziative Arrays verwendet wurde, die in einigen Datensuchfunktionen verwendet werden.Ich habe „OnOpen“ in etwas anderes umbenannt, um es zu deaktivieren, damit es nicht ausgelöst wird, wenn ich die Tabelle öffne, die Auswertungen aber trotzdem stattfinden.
Ich habe ein JSL-Skript geschrieben, um in die Spalteneigenschaften der meisten Formelspalten zu gehen und dort die Auswertung zu unterdrücken, weil ich weiß, dass diese Option beim Speichern der Tabelle erhalten bleibt. Die vollständige Tabellenauswertung dauert jetzt also nicht mehr annähernd so lange.Ich schätze, ich werde es von nun an so handhaben: Unterdrücken Sie die Auswertung einzelner Spalten, und wenn ich neue Daten importiere, für deren Ausführung die Formeln erforderlich sind, heben Sie die Unterdrückung vorübergehend mithilfe eines Skripts auf.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Ich konnte keine Tabelle erstellen, die Formeln enthält, die beim Öffnen ausgewertet werden.@chungwei
Die Einstellung kann Auswirkungen auf JMP-Tabellen haben, die in JMP 5 oder so erstellt wurden.Ich kann nicht sehen, dass es derzeit etwas bewirkt.
Es ist möglich, die roten Dreiecksoptionen der Datentabelle zu verwenden, um die Formelauswertung zu unterdrücken und eine Tabelle in diesem Zustand (mit teilweise ausgewerteten Spalten) zu speichern. Sie können rerunFormulas aus demselben roten Dreieck verwenden, um die Aktualisierung zu erzwingen (oder von JSL). (Das könnte das sein, wonach Sie fragen.)
Der Grund, den der Präfekt sagt nicht empfohlen Wird es sehr verwirrend, wenn für Tabellen das Unterdrückungsbit gesetzt wird ... oder das war einmal der Fall?
Wenn Sie sich an den technischen Support wenden, wird dieser einen Fehler erfassen und nachverfolgen (oder herausfinden, warum die Einstellung besteht und was sie bei Tabellen mit älteren Formaten bewirkt/hat).
Es gibt kein Debugging-/Protokollierungs-Framework.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Craige, es ist eine gute Idee, in das Protokoll zu schreiben, wenn eine Formel ausgewertet wird.Ich werde diese Technik verwenden, um die UI-Verzögerung und Verzögerungen in meinem Projekt, die mit der Formelauswertung zusammenhängen, weiter zu beheben.Meine Methode war nicht so präzise.Aber ich habe eine Frage: Gibt es in JMP einen „Debug“-Modus oder eine „ausführliche Protokollierung“-Funktion, die ich aktivieren könnte?Es wäre schön, wenn ich nicht so viele Write-Anweisungen in meinen Code einfügen müsste, nur um herauszufinden, was JMP zu einem bestimmten Zeitpunkt tut.
Allerdings muss ich dieses Projekt vorerst noch unverändert für meine aktuelle Arbeit verwenden.Ich möchte lediglich die Formelauswertung vollständig unterdrücken und die Formeln bei Bedarf manuell erneut ausführen.Auch wenn ich im Einstellungsmenü die Option „Auswertung beim Öffnen unterdrücken“ aktiviert habe, wertet JMP die Formeln immer noch sofort aus, wenn ich die Tabelle öffne.Gibt es eine Möglichkeit, alle automatischen Formelauswertungen in dieser Tabelle vollständig zu verhindern?Wenn diese Einstellung dies tun soll, aber nicht funktioniert, gibt es eine Möglichkeit, einen Fehlerbericht einzureichen?
Zu Ihrer Information: Ich verwende JMP PRO 14.1 unter Windows 10 x64.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Welche Version von JMP verwenden Sie?
Soweit ich das beurteilen kann, macht 14 das, was ich erwartet habe; Hier ist meine Test-JSL
New Table( "Untitled", add rows(3),
// EVERYTHINGCOL depends on everything. it evaluates last.
New Column( "EVERYTHINGCOL", Formula( Write( "\!nEVERYTHINGCOL,row" || Char( Row() ) ); :ROWSTATECOL + :INDEPCOL + :DEPONINDEP; ) ),
// DEPONINDEP depends on INDEPCOL, but not ROWSTATECOL.
New Column( "DEPONINDEP", Formula( Write( "\!nDEPONINDEP,row" || Char( Row() ) ); :INDEPCOL + 1; ) ),
// INDEPCOL is independent. It evaluates early, maybe first.
New Column( "INDEPCOL", Formula( Write( "\!nINDEPCOL,row" || Char( Row() ) ); 17; ) ),
// ROWSTATECOL is directly dependent on row state information. It evaluates early, maybe first.
New Column( "ROWSTATECOL", Formula( Write( "\!nROWSTATECOL,row" || Char( Row() ) ); Selected( Row State() ); ) ),
)
Sehen Sie sich das Protokoll an. Die Spalten berichten über die Auswertung. Durch die Auswahl von Zeilen werden zwei der Spalten ausgewertet, die anderen beiden jedoch nicht.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Im Menü „Einstellungen“ gibt es unter „Tabellen“ die Option „Formelauswertung beim Öffnen unterdrücken (nicht empfohlen)“.Ich habe diese Option aktiviert, aber sie scheint nicht zu funktionieren.Wenn ich eine Datentabelle öffne, ist die Formelauswertung zunächst nicht unterdrückt, und ich muss sie immer noch manuell unterdrücken.Ist diese Option defekt oder verstehe ich falsch, was sie tun soll?
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Craige, mein Punkt war, dass alle Formeln neu berechnet werden ob sie vom Zeilenstatus abhängig sind oder nicht .Die überwiegende Mehrheit der Formeln hat nichts mit dem Zeilenstatus zu tun, aber eine Änderung des Zeilenstatus führt trotzdem zu einer Neuberechnung.Ich denke, JMP berechnet ständig alles, wenn etwas passiert, das sich auf eine möglicherweise vorhandene Formel auswirken könnte.Meiner Meinung nach ist das unnötig und ineffizient.Als würde man eine Streitaxt benutzen, wenn ein Skalpell ausreichen würde.Ich bin sicher, dass es einfacher ist, das Programm auf diese Weise zu programmieren. Es scheint einfach ein unkomplizierter Ansatz zu sein, und es hat mich überrascht, als ich erfuhr, dass JMP die Formelauswertung auf diese Weise handhabt.
Da ich nun besser verstehe, wie Formeln berechnet werden, kann ich das Problem sicherlich umgehen, indem ich die Formelauswertung unterdrückt lasse und dt << runFormulas; einfüge. und Wait(0); Aussage in meinen Skripten.Es wird nicht schön sein, aber es wird funktionieren, denke ich.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Ja, wenn eine Formel von den Zeilenstatusinformationen abhängt, werden durch eine Änderung der Zeilenauswahl diese Spalte und alle davon abhängigen Spalten neu ausgewertet.
Möglicherweise können Sie die Auswertung erheblich beschleunigen, indem Sie dt<
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Jim, danke für die Antwort.Diese Tabelle enthält Zeitreihendaten und ich importiere regelmäßig die aktuellsten Daten.Ich möchte die Formeln beibehalten, damit sie anhand der neuen Daten berechnet werden, nachdem sie der Tabelle hinzugefügt wurden.
Bei den meisten dieser Formeln würde der Wert nur von den anderen Daten in derselben Zeile abhängen.Das Ausschließen von Daten weiter oben in der Tabelle hätte keine Auswirkung auf die Werte unten, sodass eine Neuberechnung der gesamten Spalte nicht erforderlich ist, aber trotzdem erfolgt.Es wäre schön, wenn dies nur passieren würde, wenn die Formel eine Col Maximum() oder Lag() oder eine andere solche Funktion enthalten würde, die dazu führen würde, dass die Formel von Werten in anderen Zeilen beeinflusst wird.
Das Überraschendste für mich war auch, dass das bloße Auswahl einer Zeile löste eine vollständige Neubewertung der Tabelle aus (wie durch die CPU-Auslastung und die Reaktionsfähigkeit der Benutzeroberfläche belegt).Wenn eine Formel durch das Ausschließen einer Zeile beeinträchtigt werden könnte, warum nicht die Auswertung auslösen, wenn der Benutzer tatsächlich schließt eine Zeile aus ?Ich denke, es ist theoretisch möglich, dass ein Benutzer eine Spaltenformel schreiben könnte, die vom aktuellen Status der Zeilenauswahl abhängt, aber das scheint mir ein seltener Grenzfall zu sein.
Betreff: Warum führt das Auswählen/Abwählen von Zeilen dazu, dass Spaltenformeln neu ausgewertet werden?Die Neuberechnung wird durchgeführt, da eine Formel durch eine Änderung der Auswahl/des Ausschlusses einer Zelle für eine bestimmte Spalte beeinflusst werden könnte.Angesichts der Größe Ihrer Datentabelle würde ich in Betracht ziehen, alle Spalten zu ändern, in denen sich die Formelwerte nicht ändern, und dann die Eigenschaft „Formel“ zu entfernen, um sie in eine typische numerische Spalte umzuwandeln.