Theoretische Überlegungen zur Identifizierung von Lücken in Zahlenreihen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Hallo,

ich habe einen Server auf dem täglich Dateien von extern einlaufen. Diese Dateien enthalten eine fortlaufende Nummer, so dass man ziemlich leicht erkennen kann, ob eine Datei zwischen drin fehlt. Das Scannen der Dateien nach den entsprechenden Daten ist inzwischen gelöst, dank eurer Hilfe in diesem Thread --> viewtopic.php?f=1&t=48979

Nun ist die Frage wie ich die Lückenerkennung implementiere. Das Problem ist nämlich das die Dateien nicht schön chronologisch einlaufen, so dass temporär immer wieder Lücken bestehen. Zum Beispiel können heute die Dateinummern 5010, 5011, 5013 geliefert werden und die 5012 wird morgen nachgeliefert. Ich möchte also erst eine Fehlermeldung erhalten, wenn eine Lücke z.B. nach 3 Tagen nicht geschlossen wird.

Ich muss also täglich alle neuen Dateien scannen und die Dateinummer und den Zeitstempel speichern. Wo würdet ihr diese Informationen ablegen??? In einer SQLite Datenbank oder was kommt da noch in Frage?
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Die sauberste Lösung ist die Datenbank. Ich weiß ja nicht um wie viele Daten es sich handelt, aber damit bist du auf der sicheren Seite.
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Die Datenmenge ist überschaubar. Das sind vielleicht 20-30 Dateien am Tag.

Es würde auch reichen, wenn man die gesammelten Daten (also Dateinummer und Zeitstempel) nur ca. 60 Tage aufhebt. Ich bin an einer möglichst einfachen Lösung interessiert. Das Script soll nur zur Überwachung dienen, damit man notfalls eine Dateinummer nachfordern kann. Eine SQLite DB könnte da vielleicht schon zu viel sein, ist aber aktuell die Einzige Idee die ich habe.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die DB ist bei den paar hundert Einträgen zu viel des guten. Crawl die Verzeichnisse, und berechne das. Das dauert wenige Sekunden, und muss ja nur einmal am Tag erfolgen.
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

Das überzeugt mich. Bei den paar Werten berechne ich das gleich live.

Ist es Sinnvoll die Daten in verschachtelten Listen zu speichern? Hier mal ein Beispiel mit echten Daten.

Code: Alles auswählen

[[4608, 1592566356.4538305], [4609, 1592566366.5797093], [4610, 1592797720.3328161], [4611, 1592797725.4197545], [4612, 1592797728.3757188], [4613, 1592797736.5196204], [4614, 1592797744.997518], [4617, 1592797751.359441], [4618, 1592797755.1843948], [4619, 1592797773.5231733], [4620, 1592797761.1663225], [4621, 1592797767.3692477], [4622, 1592797780.3690906], [4623, 1592797808.783747], [4624, 1592797793.055937], [4625, 1592797798.2428744], [4626, 1592797786.20402], [4627, 1592797801.8178313], [4628, 1592797815.5916648]]
Der zweite Wert ist der Zeitstempel von

Code: Alles auswählen

os.stat(filename).st_mtime]
Wie finde ich nun effektiv die Lücken? Baue ich mir eine weitere Liste von 4608 bis 4628 und vergleiche die dann?
Benutzeravatar
__blackjack__
User
Beiträge: 13242
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@16_Bit: Du brauchst doch eigentlich nur die Nummern die ein gewisses Alter erreicht haben in einem `set()` und die Nummer der jüngsten Datei die das Alter noch nicht erreicht hat. Und dann kannst Du alle von der ältesten Nummer im `set()` bis zu der jüngsten die noch im Zeitraum liegt, prüfen ob die im `set()` fehlt. Falls ja, ALARM!
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
nezzcarth
User
Beiträge: 1647
Registriert: Samstag 16. April 2011, 12:47

Ich würde es so machen: Zum Zeitpunkt Null lässt du das Skript einmalig laufen und berechnest für jede identifizierte Lücke ein Fälligkeitsdatum von jetzt+3Tage. Das ist Index, den du dir zum Beispiel in einer Json-Datei merkst.

Anschließend lässt du das Skript in festen Zeitabständen immer wieder laufen, schaust, ob die fälligen Dateien eingetroffen sind, mahnst die überfälligen an und schreibst die, die noch im Zeitrahmen sind (inkl. neuer) wieder in die Index-Datei; bei den "Altlasten" natürlich mit dem alten Fälligkeitsdatum, bei neuen mit einem neuen. Am Anfang wirst du dadurch Dateien übersehen, die bereits zum Anfangszeitpunkt bereits in weniger als drei Tagen fällig oder sogar schon überfällig sind. Das stellt sich aber nach Ablauf der Frist dann automatisch ein und du solltest eine brauchbare Heuristik erhalten.

Das erscheint mir konzeptuell leichter zu verstehen, als eine intelligentere Lösung, bei der man sich genau anhand von 'stat' oder so anschaut, wann die "Nachbardateien" angekommen sind und daraus das exakte Fälligkeitsdaten für die fehlenden Dateien zu bestimmen.
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

__blackjack__ hat geschrieben: Montag 22. Juni 2020, 11:57 @16_Bit: Du brauchst doch eigentlich nur die Nummern die ein gewisses Alter erreicht haben in einem `set()` und die Nummer der jüngsten Datei die das Alter noch nicht erreicht hat. Und dann kannst Du alle von der ältesten Nummer im `set()` bis zu der jüngsten die noch im Zeitraum liegt, prüfen ob die im `set()` fehlt. Falls ja, ALARM!
Ich habe das jetzt leider nicht verstanden - könnte auch am mangelnden Schlaf liegen. Könntest du das, wenn es keine Umstände macht, noch mal mit anderen Worten erklären?
Benutzeravatar
16_Bit
User
Beiträge: 21
Registriert: Donnerstag 26. März 2020, 14:14

@nezzcarth

Danke für die Idee. Das mit dem Fälligkeitsdatum für gefundene Lücken finde ich gut.
Antworten