4 Mill. Koordinatenzeilen auslesen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: 4 Mill. Koordinatenzeilen auslesen

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 08 Dec 2023, 07:30

Sorry für die späte Antwort - irgendwie gehen die AHK - Benachrichtigungen vorbei.
just me wrote:
27 Oct 2023, 05:16
...Hast Du Lust und Zeit, das auch einmal zu probieren? ...
Danke, derzeit nicht. Es läuft derzeit gut und in andere Kleinfunktionen eingepackt - da bin ich derzeit zufrieden.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by just me » 27 Oct 2023, 05:16

Moin @Peter2,

ich habe das jetzt mal mit der 0.5-Datei auf meinem lüfterlosen Mini-PC mit Celeron N5100, 8 GB RAM, einer SSD der unteren Preisklasse und Win 10 Pro /AHK 64-Bit ausprobiert.

Das Überführen der 4 Millionen Datensätze in deine SQLite-Datenbank mit passendem Index dauert - wenn man alle notwendigen Schritte kennt - nicht einmal eine Minute. Die Dauer vom Start eines AHK-Skripts für die Abfrage mit den X/Y-Koordinaten des Datensatzes 3999999 bis zur Ausgabe der Z-Koordinate ist für mein Zeitempfinden kaum spürbar. Hast Du Lust und Zeit, das auch einmal zu probieren? Ich würde dann hier eine Anleitung für das Erstellen der DB und ein Testskript einstellen.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 24 Oct 2023, 07:21

Also die Daten sind hier frei verfügbar:
https://www.swisstopo.admin.ch/de/geodata/height/alti3d.html#dokumente

Bei 0.5m hat man 4 Mill. Zeilen, und man kann mehrere Dateien auch mergen und d en Computer quälen.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by just me » 24 Oct 2023, 04:53

Hallo @Peter2,

wenn Du hast, was Du brauchst, ist das ok.
Trotzdem schade, es hätte mich interessiert, wie schnell SQLite mit 4 Millionen Tabellenzeilen arbeiten kann.

Mach's gut,
just me

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 24 Oct 2023, 03:04

Servus @just me
danke für den Hinweis mit den zwei Skripts. Ist für die weitere Zukunft auch in anderen Dingen sicher eine Option. Das SQl-Thema ist sicher sehr ausgetüftelt, aber ich bin derzeit wirklich unter einer Sekunde im Gesamtablauf - "Autocad - Aufruf AHK - Rückgabe an Autocad", und damit kann ich leben, zumal das Programm nicht 24/7/52/365 laufen wird.

:bravo:

Re: 4 Mill. Koordinatenzeilen auslesen

Post by just me » 24 Oct 2023, 02:13

Moin @Peter2,

wenn Du ein mehrfaches Einlesen verhindern willst, fallen mir spontan zwei 'einfache' Lösungen ein.
  1. Du verteilst die Suche auf zwei Skripte.
    Das erste wird einmal gestartet, liest die Datei ein und 'wartet' dann in einer Schleife darauf, dass eine Datei mit einem Koordinatepaar gefüllt wird. Die werden dann eingelesen, die dritte Koordinate wird ermittelt und die Datei dann gelöscht.
    Das zweite Skript schreibt nur die Koordinatepaare in die Datei.
  2. Du schreibts die Koordinaten in eine SQLite-Datenbank. Das hört sich vielleicht schlimmer an, als es ist. Dann kannst Du per SQL-Anweisung direkt aud die DAten zugreifen, ohne vorher lesen zu müssen. Ich bin gern bereit, Dich bei der Umstellung zu unterstützen.
Außerdem mag es sich anbieten, das Skript einmal zu starten, die Datei einzulesen und dann die Eingabe der gesuchten Koordinaten per Hotkey auszulösen.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 23 Oct 2023, 06:50

just me wrote:
21 Oct 2023, 06:35
....Du könntest mal RegExMatch() ausprobieren:...
Das mag aber bei sehr großen Datenmengen Probleme bereiten.
Fantastisch. Für den gleichen Suchlauf jetzt 0.3 sec. statt 3.5. Damit ist das andere Thema - die Zeit für das Einlesen - eigentlich erledigt.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 23 Oct 2023, 05:19

Danke, werde ich gleich testen.

Aber derzeit wurschtle ich bei einem anderen "Zeitfresser-Problem" herum.

Der Code hat den Ablauf:
a) lese die Datei in eine Variable
b) durchsuche die Variable

Schritt a) wiederholt sich jedesmal, was ja eigentlich sinnlos ist. ich müsste nur einmal lesen, dann immer wieder die Variable durchsuchen.

Da stolpere ich aber über die Grundlogik "Programmaufruf - Programm ruhen - Programm im zweiten Schritt aufrufen".
Ist für Kenner sicher mit zwei (richtigen) Zeilen erledigt.
Welche sind das?

Re: 4 Mill. Koordinatenzeilen auslesen

Post by just me » 21 Oct 2023, 06:35

Moin,

Du könntest mal RegExMatch() ausprobieren:

Code: Select all

#NoEnv
#Persistent
SetBatchLines, -1
SetWinDelay, 0
#SingleInstance,Force

FileRead, DateiInhalt, d:\05.xyz
MsgBox Eingelesen!
X := "2698575.25"
Y := "1280000.25"
If RegExMatch(DateiInhalt, "m)^" . X . " " . Y . " \K.+$", Z)
   MsgBox, %Z%
Else
   MsgBox, Kein Treffer für %X%/%Y%!
Das mag aber bei sehr großen Datenmengen Probleme bereiten.

Re: 4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 20 Oct 2023, 08:31

So, mit diesem Standardcode komme ich auf ca. 5 sek bei Sucherfolg in der 4-Millionsten-Zeile, somit im Durchschnittsbereich 2-3 sek. Bin fürs erste zufrieden, aber schneller geht immer.

Code: Select all

#NoEnv
#Persistent
SetBatchLines, -1
SetWinDelay, 0
#SingleInstance,Force


FileRead, OutputVar, d:\05.xyz
msgbox eingelesen

Loop, parse, OutputVar, `n, `r  ; Specifying `n prior to `r allows both Windows and Unix files to be parsed.
{
    zeile := StrSplit(A_LoopField, A_Space)
   if (zeile[1] = 2698575.25 and zeile[2] = 1280000.25)
   {
    hoehe := zeile[3]
      MsgBox %hoehe%
    }
}
msgbox fertig

4 Mill. Koordinatenzeilen auslesen

Post by Peter2 » 20 Oct 2023, 07:55

Edit:
Thema passabel gelöst, aber als Challenge bin ich auf Verbesserungen gespannt.

-------------------------------------------------------

Ich habe Textdateien, die enthalten bis zu 4 Mill. Zeilen Koordinaten - einfache XYZ-Sammlungen.

123456.50 568412.75 123.25
....

Das erstmalige Einlesen der Datei selbst darf die entsprechenden Sekunden dauern, dann sollte das im Speicher bleiben.

Jetzt geht es darum, durch einen CLI-Aufruf eines anderen Programms aus dieser Variable den dritten Wert zu suchen, also...
- suche 123456.50 568412.75
- ermittle den dritten Wert
- gib den dritten Wert irgendwie zurück

Dass ich das "irgendwie" schaffe hoffe ich schon, aber bevor ich da lange in die falsche Richtung laufe:
- Welche Funktionen empfehlen sich für eine möglichst schnelle Lösung?
- Das sollte auf "klick-zack" funktionieren ;-)
- Und das natürlich immer wieder

Danke im voraus und schönes Wochenende
Peter

Top