Archivwerte übertragen zwischen Variablen verschiedenen Typs

Naja, da bin ich völlig anderer Meinung. Systemfunktion muss einfach schlicht und ergreifend in der Umgebung zu sehen sein was im Hintergrund passiert wenn man diese gestartet hat.

Man hat wieder kein Feedback was passiert und in welchem Zustand das System sich befindet.

Letzen Endes hat man wieder keine Kontrolle und kein sicheres Verhalten wo man abdecken kann.

Dann muss man sehen was man da macht. Echt wieder ärgerlich das ganze …

Sorry, aber die Routine habe ich zur Verfügung gestellt um anderen zu helfen. Sie hat keinen Anspruch auf Perfektion. Noch weniger ist es eine Systemfunktion.

Sicherlich kann man sie verbessern. Da ist jedem freigestellt, es zu tun.

Burkhard

@bumaas , tut mir vielmals leid, du hast das glaube ich falsch verstanden bzw. ich habe das nicht eindeutig genug beschrieben.

Das war grundlegend auf das System bezogen nicht auf dein Script.

Dein Aufwand mit besten Dank nochmals an dich zurück, das nehme ich sehr gerne an.

Gruß

@paresy
Ich habe nochmal probiert mich mit dem Thema auseinander zusetzen.
Thema ist das irgendwann die Verbindung zur Konsole abbricht.
Ich versuche über das Script 23Millionen Datensätze zu kopieren. Ich nutze die Scriptvorlage von @bumaas.

Bei mir kommt noch dazu das nach dem Absturz der Konsole in den PHP Infos das Script seltsamerweise dann dreimal aufgerufen wurde.

Ich habe mir das Thema nun ebenfalls noch einmal angesehen und das Skript zum Test noch etwas erweitert.

Meine Ergebnisse:

  • 10.000 Datensätze werden extrem schnell übertragen: 490 ms
  • 100.000 Datensätze werden ebenfalls extrem schnell übertragen: 5600 ms
  • 1.000.000 Datensätze brauchen dagegen 260.000 ms

Bei 5 Mio Datensätze treten Fehler auf:

  • nach exakt 5 Minuten laufzeit taucht ein zweiter Thread auf:


    ab da werden die Daten doppelt übertragen :scream:

  • nach 10 Minuten Laufzeit meldet die Konsole einen Fehler: „Konnte PHP Skript nicht ausführen. Connection Lost“

  • die Konsole verbindet sich neu, zeigt aber im Skripteditor das Skript nicht mehr als aktiv an.

  • nach ca. 25 Minuten ist der ursprüngliche Thread beendet und es wurden alle 5 Mio Datensätze übertragen

  • nach ca. 36 Minuten ist auch der zweite Thread beendet und hat ebenfalls alle 5 Mio Datensätze übertragen

  • die Zielvariable beinhaltet nun 10 Mio Datensätze

Hier noch der graphische Verlauf:

@paresy: Ich hoffe, das hilft weiter.

Burkhard

Warum soll mal ein Script 5 Minuten laufen lassen :smiley:
Wenn du schon die Datensätze in 1000er Stücke zerhackst. Dann lass die Schleife doch weg und dafür das Script sich selbst neu starten. Dann blockiert das Script nicht ewig die PHP-Threads.
Dafür gibt es ja IPS_RunScriptEx, wo du die Werte von $endtime und $count übergeben kannst.
Michael
PS: Nur weil das Laufzeitlimit entfernt wurde, sollte man Scripte nicht ‚ewig‘ ausführen.
PPS: Es wurde ja nur entfernt weil es noch mehr Probleme machte.

Warum sollte man es künstlich zerhacken? Nur um alle X Minuten einen anderen Thread zu belegen? :thinking:

Aber noch eine Ergänzung zu meinen Beobachtungen:

Wenn man das Skript über das Kontextmenu „Automation ausführen“ aufruft, dann läuft alles korrekt.

Also liegt es wohl wirklich daran, dass die Konsole im Skripteditor (und nur dort) maximal 5 Minuten auf das Ende des Skripts wartet. Das ist ja auch eigentlich ok.

Warum die Konsole dann aber das Skript von sich aus neu startet, das erschließt sich mir nicht.

Damit auch andere Scripte die Chance bekommen mal eben für ein paar ms ausgeführt zu werden?
Es gab schon immer die Maßgabe das Scripte nur so kurz wie nötig ausgeführt werden sollen.
Vermutlich hast du jetzt den negativen Nebeneffekt des aufgehobenen Laufzeitlimit gefunden.
Wie hättest du es denn früher bei dem 60Sek. Limit gelöst?
Michael

PS: Wäre es nicht ‚schneller‘ direkt die CSV zu verändern und dann einmal zu reaggregieren?

Zum Thema 5 Minuten: es gibt gerade einen parallelen Thread. Scheint ein Fehler der aktuellen Konsole zu sein.

Zum Laufzeitkonzept: Entweder die Scripte werden beendet nach z.B. 60 Sekunden und ich kann mich drauf verlassen (z.B. bei Verwendung von ‚buggy PHP Funktionen‘) oder ich kann sie laufen lassen solange ich will.

Wie hier halt einmalig z.B. 10 Minuten für eine rechenintensive Aufgabe. Gerade bei solch einmaligen Aktionen und häufig 50 möglichen PHP Slots, sehe ich hier keine Probleme.

Sehe ich genauso. Es ist ein Skript für den Fortgeschrittenen zum gelegentlichen Gebrauch in Sondersituation.

Auf keinen Fall aber darf von der Konsole ein Skript einfach erneut gestartet werden.

Die Funktion wurde ja entfernt, weil das Abschießen von PHP-Threads mehr Probleme verursacht hat, als gelöst. Die Threads blieben dennoch gerne mal hängen. Das ist jetzt IMHO weniger/weg.

Aber dies jetzt als Grund zu benutzen um zu argumentieren Scripte dürfen jetzt ewig laufen ist leider eine falsche Schlussfolgerung.

Dann darf man doch dieses technische Verständnis bei Fortgeschrittenen annehmen? :wink:

Korrekt.
Michael

Moin Michael,

das können aber viele csv-Dateien sein, wenn man mehrere Jahre eine Variable geloggt hat :wink: Ich hatte mal so einen Fall und habe dann letztendlich ein Script wie @bumaas geschrieben.

Gruß
Hans

Ah, stimmt. Daran hatte ich nicht gedacht. Und die etwas weniger Dateioperation für öffnen/schließen machen den Kohl wohl auch nicht fett.
Michael

@bumaas
Danke für deine ausführlichen Tests und Beschreibung.

Aber dann für mich als Laie nochmal, wie man in so einem Fall von sehr vielen Millionen Daten jetzt damit umgehen soll hier ein sicheres und problemloses Transferieren der Daten hinbekommen soll.

Ich sehe jetzt irgendwie keine kein wirklich guten Lösungsansatz !

Gruß

Zur Zeit sollte man langlaufende Skripte nicht aus dem Editor heraus starten. Denn dort werden sie nach 5 Minuten erneut aufgerufen.

Stattdessen sollten sie momentan über das Kontextmenü gestartet werden.

Für das Thema wird @Dr.Niels sicherlich eine Lösung finden.