Mehr

Zeilenauswahl wiederholen nimmt zu viel vom Modell in die ModelBuilder-Schleife?

Zeilenauswahl wiederholen nimmt zu viel vom Modell in die ModelBuilder-Schleife?


Ich hänge ein wenig an einem relativ einfachen Modell fest.

Was ich will:

1) Erstellen Sie eine Tabelle "Ergebnisse".

2) Schleife über "Punkte".

3) Mach etwas Puffer und zähle

4) Setzen Sie die Ergebnisse (OBJECTID und count) über "addRecord" in "Ergebnisse"

5) Gehe zu 2

Was es macht: 1) -> 2) -> 3) -> 4) und dann erzeugt es wieder "Ergebnisse", die die Ergebnisse irgendwie leeren.

Irgendwelche Hinweise?

addRecord sieht so aus:

import arcpy infile = arcpy.GetParameterAsText(0) IDFieldValue = long(arcpy.GetParameterAsText(1)) CountFieldValue = arcpy.GetParameterAsText(2) rows = arcpy.InsertCursor(infile) row = rows.newRow() row.setValue("OID ", IDFieldValue) row.setValue("count", CountFieldValue) rows.insertRow(row) del row del rows


Sie müssen Ihr Modell in zwei Modelle aufteilen. So wie Sie es jetzt haben, wird die Ergebnistabelle bei jeder Iteration erstellt. Schritt 1 muss sich in einem separaten Modell befinden, das ein Untermodell aufruft, das die restlichen Schritte ausführt. In dieser Hilfedatei erfahren Sie, wie Sie verschachtelte Modelle einrichten.


Das Erstellen von Excel-Dokumenten ist sehr langsam

Im Anhang ist ein generischer Code, den ich geschrieben habe, um eine Excel-Datei mit x Arbeitsblättern zu erstellen.

Das Problem, das ich habe, ist, dass es ziemlich langsam ist, etwa 5 Sekunden pro Blatt. Nach meinem Verständnis war die Verwendung einer for-Schleife beim Erstellen der Tabellen ideal, aber das Problem scheint bei Tabellen mit über tausend Datensätzen zu bestehen. Ich denke immer noch, dass es nicht so lange dauern sollte.

Alle mögliche Hinweise würden geschätzt. Wenn ich mit diesem Code komplett im linken Feld bin, lassen Sie mich wissen, dass aktuelle Excel-Code-Ressourcen schwer zu finden sind.


5 Antworten 5

Ich würde das nicht mit einer Schleife machen, da gibt es viel bessere Alternativen. Mit Abstand das Beste, wenn du haben aufzuteilen, ist CLR, und der Ansatz von Adam Machanic ist der schnellste, den ich getestet habe.

Der nächste beste Ansatz ist IMHO, wenn Sie CLR nicht implementieren können, eine Zahlentabelle:

. was diese Funktion ermöglicht:

Ich glaube, all dies wird besser funktionieren als die Funktion, die Sie haben, wann Sie bekommen es zum Laufen, zumal sie Inline statt Multi-Statement sind. Ich habe nicht untersucht, warum deine nicht funktioniert, weil ich denke, es lohnt sich nicht, diese Funktion zum Laufen zu bringen.

Aber das alles gesagt.

Gibt es einen Grund für die Aufteilung, da Sie SQL Server 2008 verwenden? Ich würde dafür lieber einen TVP verwenden:

Jetzt können Sie dies als Parameter für Ihre gespeicherten Prozeduren akzeptieren und den Inhalt wie einen TVF verwenden:

Und Sie können ein TVP direkt aus C# usw. als DataTable übergeben. Dies übertrifft mit ziemlicher Sicherheit alle oben genannten Lösungen, insbesondere wenn Sie in Ihrer App eine durch Kommas getrennte Zeichenfolge erstellen, damit Ihre gespeicherte Prozedur einen TVP aufrufen kann, um ihn wieder aufzuteilen. Weitere Informationen zu TVPs finden Sie im großartigen Artikel von Erland Sommarskog.

Vor kurzem habe ich eine Serie über das Teilen von Strings geschrieben:

Und wenn Sie SQL Server 2016 oder neuer (oder Azure SQL-Datenbank) verwenden, gibt es eine neue STRING_SPLIT-Funktion, über die ich hier gebloggt habe:


3 Antworten 3

Da Sie keine Änderungen an vorhandenen Objekten vornehmen, können Sie die AutoDetectChangesEnabled-Eigenschaft Ihres Kontexts auf false festlegen.

Ruft einen Wert ab, der angibt, ob die DetectChanges-Methode automatisch von Methoden von DbContext und verwandten Klassen aufgerufen wird, oder legt diesen fest. Der Standardwert ist wahr.

Das Aufrufen von Add ruft jedes Mal die DetectChanges-Methode auf und ist teuer. Schalten Sie es aus und am Ende wieder ein.

Außerdem rufen Sie die SaveChanges-Methode auf jeder Iteration in Ihrer Schleife. Dies bedeutet, dass Sie Ihre Datenbank bei jeder Iteration aufrufen, um diese Entität beizubehalten, und dies ist intensiv und zeitaufwendig. Platzieren Sie diese Codezeile außerhalb Ihrer Schleife.

Es ist viel leistungsfähiger, einen Anruf für viele Artikel zu tätigen, als viele Anrufe für einen Artikel!


SQL-Update-Anweisung dauert sehr lange / hohe Festplattennutzung für Stunden

Ja, das hört sich nach einem sehr allgemeinen Problem an, aber ich konnte es noch nicht sehr eingrenzen.

Also habe ich eine UPDATE-Anweisung in einer SQL-Batch-Datei:

B hat 40k Datensätze, A hat 4 Mio. Datensätze und sie sind 1-zu-n über A.B_ID verbunden, obwohl es zwischen den beiden keinen FK gibt.

Im Grunde berechne ich ein Feld für Data-Mining-Zwecke im Voraus. Obwohl ich den Namen der Tabellen für diese Frage geändert habe, habe ich die Aussage nicht geändert, es ist wirklich so einfach.

Das dauert Stunden, also habe ich beschlossen, alles zu stornieren. Die DB wurde beschädigt, also löschte ich sie, stellte eine Sicherung wieder her, die ich kurz vor der Ausführung der Anweisung erstellt hatte, und beschloss, mit einem Cursor näher ins Detail zu gehen:

Jetzt kann ich sehen, dass es mit einer Nachricht mit absteigender ID ausgeführt wird. Was passiert, ist, dass es ungefähr 5 Minuten dauert, von nach > . zu gelangen

Und dann bei ID 13 scheint es aus irgendeinem Grund zu hängen. Die DB hat außer SSMS keine Verbindung dazu, aber sie ist nicht wirklich aufgehängt:

    die Festplatte läuft ständig, also tut sie definitiv etwas (ich habe im Process Explorer überprüft, ob es tatsächlich der sqlserver.exe-Prozess ist, der sie verwendet)

Ich habe sp_who2 ausgeführt, die SPID (70) der SUSPENDED-Sitzung gefunden und dann das folgende Skript ausgeführt:

select * from sys.dm_exec_requests r Join sys.dm_os_tasks t on r.session_id = t.session_id wobei r.session_id = 70

Dies gibt mir den wait_type, der meistens PAGEIOLATCH_SH ist, sich aber manchmal in WRITE_COMPLETION ändert, was wahrscheinlich passiert, wenn das Protokoll geleert wird

Andere vielleicht nützliche Informationen:

  • die Anzahl der Datensätze in Tabelle A für B_ID 13 ist nicht groß (14)
  • Meine Kollegin hat nicht das gleiche Problem auf ihrem Computer, mit einer Kopie dieser DB (von vor ein paar Monaten) mit der gleichen Struktur.
  • Tisch A ist mit Abstand der größte Tisch in der DB
  • Es verfügt über mehrere Indizes und wird von mehreren indizierten Sichten verwendet.
  • Es gibt keinen anderen Benutzer in der DB, sie ist lokal und wird von keiner Anwendung verwendet.
  • Die Größe der LDF-Datei ist nicht begrenzt.
  • Das Wiederherstellungsmodell ist EINFACH, der Kompatibilitätsgrad beträgt 100
  • Procmon gibt mir nicht viele Informationen: sqlserver.exe liest und schreibt viel aus den MDF- und LDF-Dateien.

Ich warte immer noch darauf, dass es fertig ist (es ist 1h30 her), aber ich hatte gehofft, dass mir vielleicht jemand eine andere Aktion gibt, mit der ich versuchen könnte, das Problem zu beheben.

Bearbeitet: Extrakt aus dem Procmon-Log hinzufügen

Von der Verwendung von DBCC PAGE scheint es aus Feldern zu lesen und zu schreiben, die wie die Tabelle A (oder einer ihrer Indizes) aussehen, aber für andere B_ID, die 13. Indizes vielleicht neu erstellen?

Bearbeitet 2: Ausführungsplan

Also habe ich die Abfrage abgebrochen (eigentlich die DB und ihre Dateien gelöscht und dann wiederhergestellt) und den Ausführungsplan überprüft auf:

Der (geschätzte) Ausführungsplan ist der gleiche wie bei jedem B.ID und sieht ziemlich einfach aus. Die WHERE-Klausel verwendet eine Indexsuche für einen nicht gruppierten Index von B, die JOIN verwendet eine gruppierte Indexsuche für beide PKs der Tabellen. Die Clustered-Index-Suche auf A verwendet Parallelität (x7) und repräsentiert 90 % der CPU-Zeit.

Noch wichtiger ist, dass die eigentliche Ausführung der Abfrage mit der ID 13 sofort erfolgt.

Bearbeitet 3: Indexfragmentierung

Der Aufbau von Indizes ist wie folgt:

B hat einen gruppierten PK (nicht das ID-Feld) und einen nicht gruppierten eindeutigen Index, wobei das erste Feld B.ID ist - dieser zweite Index scheint immer verwendet zu werden.

A hat einen geclusterten PK (Feld nicht verwandt).

Es gibt auch 7 Ansichten auf A (alle enthalten das A.X-Feld), jede mit ihrem eigenen geclusterten PK und einem anderen Index die auch das A.X-Feld enthält

Die Ansichten werden gefiltert (mit Feldern, die nicht in dieser Gleichung enthalten sind), daher bezweifle ich, dass das UPDATE A dies tun würde benutzen die Ansichten selbst. Aber sie haben einen Index, der A.X enthält, also bedeutet das Ändern von A.X, dass die 7 Ansichten und die 7 Indizes geschrieben werden, die das Feld enthalten.

Obwohl erwartet wird, dass das UPDATE dafür langsamer ist, gibt es keinen Grund, warum eine bestimmte ID so viel länger wäre als die anderen.

Ich habe die Fragmentierung für alle Indizes überprüft, alle waren bei <0,1%, außer den sekundären Indizes der Ansichten, alle zwischen 25% und 50%. Füllfaktoren für alle Indizes scheinen in Ordnung zu sein, zwischen 90 % und 95 %.

Ich habe alle sekundären Indizes neu organisiert und mein Skript erneut ausgeführt.

Es wird immer noch gehängt, aber an einer anderen Stelle:

Während zuvor das Nachrichtenprotokoll so aussah:

Das ist seltsam, weil es bedeutet, dass es nicht einmal an derselben Stelle in der WHILE-Schleife aufgehängt wird. Der Rest sieht gleich aus: gleiche UPDATE-Zeile in sp_who2, gleicher PAGEIOLATCH_EX-Wartetyp und gleiche starke HD-Nutzung von sqlserver.exe.

Der nächste Schritt besteht darin, alle Indizes und Ansichten zu löschen und sie meiner Meinung nach neu zu erstellen.

Bearbeitet 4: Indizes löschen und dann neu aufbauen

Also habe ich alle indizierten Ansichten gelöscht, die ich in der Tabelle hatte (7 davon, 2 Indizes pro Ansicht, einschließlich der geclusterten). Ich habe das anfängliche Skript (ohne Cursor) ausgeführt und es lief tatsächlich in 5 Minuten.

Mein Problem stammt also von der Existenz dieser Indizes.

Ich habe meine Indizes nach dem Ausführen des Updates neu erstellt und es dauerte 16 Minuten.

Jetzt verstehe ich, dass es Zeit braucht, Indizes neu zu erstellen, und ich bin eigentlich damit einverstanden, dass die vollständige Aufgabe 20 Minuten dauert.

Was ich immer noch nicht verstehe ist, warum es mehrere Stunden dauert, wenn ich das Update ausführe, ohne die Indizes zuerst zu löschen, aber wenn ich sie zuerst lösche und dann neu erstelle, dauert es 20 Minuten. Sollte es nicht in etwa gleich lange dauern?


  • Ultraschneller Reinigungszyklus von 1,5 Stunden
  • Modernste Kartensoftware
  • Erstaunliche dreifache Bürstenwirkung
  • Überlegene Filterfunktionen
  • Bleibt nie in Abflüssen stecken
  • Ideal für eingelassene Pools bis zu 15 m 50.

Der Dolphin Nautilus CC Supreme verfügt über eine beeindruckende Reihe fortschrittlicher Funktionen. Zum Beispiel haben die meisten Reinigungsroboter nur zwei Scheuerbürsten. Der Supreme bietet Ihnen jedoch eine dritte Bürste, die sich mit hoher Geschwindigkeit dreht, um unansehnlichen Schmutz von Ihren Poolwänden und -böden zu entfernen.

Es hat auch vier Reinigungsmodi mit drei verschiedenen Zeitzyklen. So können Sie Reinigungsaufgaben präziser und effizienter bewältigen.

Mit 1,5 Stunden hat diese Maschine eine der schnellsten Reinigungszeiten aller Poolroboter der Welt. Im Gegensatz zu anderen Modellen kann es die Wände Ihres Pools skalieren, um an die Wasserlinie zu gelangen. Und es wird weiterhin unerbittlich weggespült, bis jeder Fleck, jeder Makel und jede Verfärbung, die den visuellen Reiz Ihres Pools beeinträchtigt, für immer verbannt ist.

Der Dolphin Nautilus CC Supreme wird ohne Caddy geliefert. Sie denken, Sie würden einen mit einem Reinigungsroboter bekommen, der so viel kostet! Sie erhalten auch keine Fernbedienung. Das ist wahrscheinlich in Ordnung, denn mit der MyDolphin-App können Sie alles tun, was ein Controller tut.

Wie die meisten anderen Roboter ist er beim Treppensteigen nicht sehr gut.

Die Kunden sind begeistert, dass es nicht im Abfluss stecken bleibt. Außerdem besteht ein überwältigender Konsens darüber, dass dieser Roboter mehr Saugkraft hat als alle anderen, die sie zuvor ausprobiert haben.

Eine andere Sache, die Benutzer lieben, ist, wie fantastisch die leistungsstarke Dreifachbürstenwirkung potenziell giftigen Biofilm von jeder Pooloberfläche entfernt. Schließlich sind viele Kunden von den hervorragenden Filterfähigkeiten dieses Geräts begeistert.

Der schnellste Reinigungszyklus des Dolphin Nautilus Plus beträgt zwei Stunden. Das Dolphin Nautilus CC Supreme schlägt das jedoch mit einer Reinigungszeit von 1,5. Der CC Plus arbeitet auch nicht so gründlich wie der Supreme, sodass Sie ihn möglicherweise mehr als einmal ausführen müssen, um Ihren Pool sauber zu machen.

Der CC Plus hat auch nicht die dritte Reinigungsbürste, die der Supreme hat. Dies bedeutet, dass es nicht in der Lage ist, Ihre Wasserleitung oder Ihren Abfluss zu reinigen. Lesen Sie unseren vollständigen Testbericht zum Dolphin Nautilus CC Plus.

Der Dolphin Nautilus CC ist auf die Reinigung von Pools mit einer Länge von 35 Fuß oder weniger beschränkt. Tatsächlich kann der Dolphin Nautilus Supreme jedoch größere Pools bis zu 15 m reinigen. Der Dolphin Nautilus CC ist viel billiger, da er nicht über die erweiterten Funktionen des Supreme verfügt.

Außerdem hat der Dolphin Nautilus CC kein Anti-Tangle-Kabel, sodass er beim Reinigen eher an einem Hindernis hängen bleibt.

Mit einem dreistündigen Reinigungszyklus benötigt der Dolphin Nautilus deutlich länger als der Supreme. Außerdem ist das Entfernen der Patronen zum Reinigen beim Supreme SO viel einfacher, da sie von oben statt von unten geladen werden.

Ein weiterer Unterschied zwischen den beiden besteht darin, dass der Dolphin Nautilus nur über zwei Standard-Scheuerbürsten verfügt, während der mehr Supreme einen Hochgeschwindigkeits-Mittenschrubber zur Mischung hinzufügt. Lesen Sie unsere vollständige Bewertung des Dolphin Nautilus.


Warum braucht R so viel Zeit, um auto.arima() auszuführen. Wie kann ich die Berechnungszeit verkürzen? [Duplikat]

Ich habe versucht, Analysen durchzuführen und eine Reihe von Spotpreisen für Erdgas zu modellieren. Mit Daten, die von der Qandl-API bereitgestellt werden.

Die ganze Analyse hat gut funktioniert, ich habe jedoch Probleme mit der auto.arima-Funktion.

1- Wenn ich die NG-Serie als XTS angebe, berücksichtigt die auto.arima-Funktion die Saisonalität nicht. Für Erdgas ist das ziemlich schade, denn der Verbrauch dieser Ressourcen hängt von der Jahreszeit ab.

2- Wenn ich die NG-Serie als TS angebe, dauert die Berechnung der auto.arima-Funktion ewig, und ich bin mir nicht einmal sicher, ob sie sie beenden kann. Als ich die Berechnung einmal 20 Minuten lang laufen ließ, konnte keine Antwort gefunden werden. Daher frage ich mich, ob es ein Problem mit meinem Code oder meiner Spezifikation gibt. Ich bin neu in Data Science, es ist mein erstes TS-Projekt. Ich liebe wirklich, was ich tue!

Was schlagen Sie vor? Ich habe darüber nachgedacht, die saisonale Arima-Funktion manuell anzugeben, aber mir fehlen im Moment die Fähigkeiten, um dies zu tun. Wo soll ich anfangen zu lernen, wie man die Funktion selbst spezifiziert? Was habe ich in meinem Code falsch gemacht?


Möglicherweise wurde die Uhr zurückgesetzt. Das Einstellen der Uhr kann dieses Problem beheben.

  1. Gehen Sie in den Wiederherstellungsmodus.
  2. Wählen Sie in der Menüleiste Dienstprogramme.
  3. Öffnen Sie das Terminal.
  4. Typ: Datum , z.B. Datum 0804221520 für den 4. August 2020, 22:15 Uhr.
  5. Versuchen Sie, die Installation erneut auszuführen. Es sollte jetzt in weniger als einer Minute weitergehen.

Wenn dies nicht hilft, kann die Anzeige der "Istaller-Protokolle" Hinweise geben, warum es zu lange dauert.


Berücksichtigen Sie Leistung und Größe von Excel-Dateiformaten

Ab Excel 2007 enthält Excel im Vergleich zu früheren Versionen eine Vielzahl von Dateiformaten. Abgesehen von den Dateiformatvarianten Makro, Vorlage, Add-In, PDF und XPS sind die drei Hauptformate XLS, XLSB und XLSX.

Das XLS-Format ist das gleiche Format wie frühere Versionen. Wenn Sie dieses Format verwenden, sind Sie auf 256 Spalten und 65.536 Zeilen beschränkt. Wenn Sie eine Excel 2007- oder Excel 2010-Arbeitsmappe im XLS-Format speichern, führt Excel eine Kompatibilitätsprüfung durch. Die Dateigröße ist fast dieselbe wie bei früheren Versionen (einige zusätzliche Informationen können gespeichert werden) und die Leistung ist etwas langsamer als bei früheren Versionen. Jede Multithread-Optimierung, die Excel in Bezug auf die Zellenberechnungsreihenfolge durchführt, wird nicht im XLS-Format gespeichert. Daher kann die Berechnung einer Arbeitsmappe langsamer sein, nachdem die Arbeitsmappe im XLS-Format gespeichert, geschlossen und erneut geöffnet wurde.

XLSB-Format

XLSB ist das Binärformat ab Excel 2007. Es ist als komprimierter Ordner strukturiert, der viele Binärdateien enthält. Es ist viel kompakter als das XLS-Format, aber das Ausmaß der Komprimierung hängt vom Inhalt der Arbeitsmappe ab. Beispielsweise weisen zehn Arbeitsmappen einen Größenverkleinerungsfaktor von zwei bis acht mit einem durchschnittlichen Verkleinerungsfaktor von vier auf. Ab Excel 2007 ist die Leistung beim Öffnen und Speichern nur geringfügig langsamer als beim XLS-Format.

XLSX-Format

XLSX ist das XML-Format ab Excel 2007 und das Standardformat ab Excel 2007. Das XLSX-Format ist ein komprimierter Ordner, der viele XML-Dateien enthält (wenn Sie die Dateinamenerweiterung in .zip ändern, können Sie den komprimierten Ordner öffnen und prüfen Sie den Inhalt). Normalerweise erstellt das XLSX-Format größere Dateien als das XLSB-Format (im Durchschnitt 1,5-mal größer), aber sie sind immer noch deutlich kleiner als die XLS-Dateien. Sie sollten damit rechnen, dass die Öffnungs- und Speicherzeiten etwas länger sind als bei XLSB-Dateien.


6 Antworten 6

Basierend auf der vorherigen Antwort ermöglicht Java Enumerationen, Eigenschaften zu haben, sodass Sie ein Strategiemuster definieren können, etwa

Dann wäre Ihr Executor (Strategie)

Und all Ihr if/else in Ihrer doPost-Methode wird zu so etwas wie

Auf diese Weise könnten Sie sogar Lambdas für die Executoren in den Enumerationen verwenden.

Verwenden Sie anstelle von Reflektion eine dedizierte Schnittstelle.

Implementiert jeden von ihnen für jede Aktion und dann:

Natürlich ist diese Lösung nicht die leichteste, so dass Sie möglicherweise nicht auf diese Länge gehen müssen.

Verwenden Sie das Befehlsmuster, dies erfordert eine Befehlsschnittstelle in etwa wie folgt:

Wenn die Aktionen leicht und günstig zu erstellen sind, verwenden Sie eine Factory-Methode. Laden Sie die Klassennamen aus einer Eigenschaftendatei, die actionName=className zuordnet, und verwenden Sie eine einfache Factory-Methode, um die Aktionen für die Ausführung zu erstellen.

Wenn die Erstellung der Aktionen teuer ist, verwenden Sie einen Pool, wie z teuer -Element zu einem vorgefertigten gemeinsamen Ressourcenpool und nicht zu den Befehlen selbst.

Diese können dann mit ausgeführt werden

Dies ist ein sehr robuster und entkoppelter Ansatz, der SRP, LSP und ISP der SOLID-Prinzipien anwendet. Neue Befehle ändern den Befehlszuordnungscode nicht. Die Befehle sind einfach zu implementieren. Sie können einfach der Projekt- und Eigenschaftendatei hinzugefügt werden. Die Befehle sollten re-entrant sein, was es sehr performant macht.