x

Re: Datenpunkte filtern und exportieren


Geschrieben von the-asca (Gast) am 07. Dezember 2020 02:11:13: [flux]

Als Antwort auf: Datenpunkte filtern und exportieren geschrieben von -Rubashov- (Gast) am 25. November 2020 00:42:

-Rubashov- wrote:

Was mache ich bei der Abfrage falsch?

"Sowjet" ist halt nicht "sowjet". Gibt 3 Möglichkeiten:
1. Sowohl nach "Sowjet" eine Abfrage, als auch nach "sowjet" (ziemlich dumm, weil alles doppelt durchsucht werden muss, Performance-Fresser)
2. beim Regulärem Ausdruck (kurz RegEx) halt sagen, dass man sowohl großes, als auch kleines S sucht:

[name~"[Ss]owjet"]

(was in eckigen Klammern im RegEx, ist halt ein "irgendeines dieser Zeichen" )
3. einfach sagen, dass bei der Suche mit RegEx generell Groß-/Kleinschreibung missachtet werden soll:

[name~sowjet,␣i]

(Würde dann natürlich auch ein "SowJet" finden ;-)

Denke damit ist dein Problem gelöst. Hier dann noch eine Lösung für ein weiteres "Problem":
Deine Anfrage, ist so geschrieben zwar völlig ok, aber frisst halt viel Performance. Denn du suchst im relativ großem Suchgebiet halt 4x nach Werten. Sprich jedes Objekt im Suchgebiet wird 4x angeschaut und da gibt es natürlich einige.
Gibt jetzt 2 Dinge die du optimieren kannst:
1. weniger oft jedes Objekt erneut "anschauen", dafür aber gleich mehrere Werte prüfen.
Musst dir vorstellen jedes Objekt anschauen ist ein aufwändiges "aus der Schublade holen -> schauen -> zurückpacken". Dann lieber nur 1x rausholen, aber gleich mehrere Dinge überprüfen, geht insgesamt schneller.
Dazu kannst halt jeweils die ersten beiden und die letzten beiden Anfragen zusammenfassen und hast somit nur noch 2 Suchläufe über alle Objekte:

//␣via␣RegEx␣auf␣den␣Key,␣können␣beide␣Keywerte␣gleichzeitig␣gecheckt␣werden.
//␣(RegEx␣auf␣Key␣erfordert␣auch␣RegEx-Suche␣nach␣Value.␣Wenn␣der␣egal,␣dann␣einfach:
//␣".*"␣was␣für␣"irgendwelche␣Zeichen␣irgendwie␣oft"␣steht
(nwr␣(area.searchArea)␣[~"^(monument|memorial)$"~".*"]␣[name~"sowjet",␣i];␣.result;␣)␣->␣.result;
//␣RegEx-Suche␣auf␣historic-Wert,␣somit␣können␣auch␣beide␣Werte␣gleichzeitig␣je␣Objekt␣geprüft␣werden
(nwr␣(area.searchArea)␣[historic~"^(monument|memorial)$"]␣[name~"sowjet",␣i];␣.result;␣)␣->␣.result;

2. Alles hat bei dir den gemeinsame Eigenschaft "name~sowjet". Da du ein grooßes Gebiet hat mit vieelen Objekten, lohnt es sich, erstmal diese extreme Anzahl an Objekten stark zu reduzieren, und dann innerhalb dieser Objekte halt genauer zu filtern.
Sprich in dem Falle: Erstmal ALLE Objekte abfragen, welche "name~sowjet" haben und dann innerhalb derer nach dem monument, memorial, ... schauen. Selbst wenn man für letzteres halt mehrfach die Schubladen öffnen muss, durch das ausfiltern von allem was "nicht-sowjet" ist, überspringt man halt massenhaft Objekte.
Somit voll optimiert (aus meiner aktuellen Sicht), wäre:

[timeout:500];
(␣{{geocodeArea:Brandenburg}};␣␣␣.searchArea;)␣->␣.searchArea;
(␣{{geocodeArea:Berlin}};␣␣␣␣␣␣␣␣.searchArea;)␣->␣.searchArea;
//␣alle␣Sowjet-Sache␣raussuchen:
nwr␣(area.searchArea)␣[name~"sowjet",␣i]␣->␣.sowjetStuff;
//␣nur␣noch␣innerhalb␣der␣Sowjet-Sachen␣suchen:
(nwr.sowjetStuff␣[~"^(monument|memorial)$"~".*"];␣.result;␣)␣->␣.result;
(nwr.sowjetStuff␣[historic~"^(monument|memorial)$"];␣.result;␣)␣->␣.result;
.result␣out␣meta;
.result␣out␣center;

Der Unterschied ist groß. Also mal getestet nur für Berliner Gebiet: 310s Abfragedauer ohne Optimierung, 116s mit den Optimierungen.

2,5. Achja und wenig überraschend geht halt [name~"[Ss]owjet"] schneller als ein [name~"sowjet", i], denn beim ersten muss ja nur 1 Buchstabe mit verschiedenen Variationen berücksichtigt werden. Bedenkt man, dass halt die Sowjet-Sachen raussuchen ja der erste Filter ist, kann man damit noch mehr rausholen:

[timeout:500];
(␣{{geocodeArea:Brandenburg}};␣␣␣.searchArea;)␣->␣.searchArea;
(␣{{geocodeArea:Berlin}};␣␣␣␣␣␣␣␣.searchArea;)␣->␣.searchArea;
//␣alle␣Sowjet-Sache␣raussuchen:
nwr␣(area.searchArea)␣[name~"[Ss]owjet"]␣->␣.sowjetStuff;
//␣nur␣noch␣innerhalb␣der␣Sowjet-Sachen␣suchen:
(nwr.sowjetStuff␣[~"^(monument|memorial)$"~".*"];␣.result;␣)␣->␣.result;
(nwr.sowjetStuff␣[historic~"^(monument|memorial)$"];␣.result;␣)␣->␣.result;
.result␣out␣meta;
.result␣out␣center;

Und man kommt auf etwa 32s. Wenn man 32s den 310s gegenüberstellt, sieht man weshalb es sich lohnt darüber nachzudenken, was da genau passiert ;-)
Auch zum Rumtesten machen 0,5min oder 5min warten ja deutlich ein Unterschied im Spaßfaktor ^^

Gruß,
asca

PS: Ich habe keine Ahnung, in wiefern die Overpass-API(-Server) irgendwelche Werte cachen und ggf. damit auch Werte verzerrt sind, ebenfalls durch unterschiedliche Lastsituationen der Server. Allerdings habe ich die Anfragen mehrfach ausgeführt, auch direkt nach den schnellen Anfragen die performancelastigen. Konnte keine großen Variationen durch mögliches Caching feststellen, ausschließen kann ich es nicht. Das sind also alles nur Angaben hier aus Tests und Logik, kann aber ggf. nicht "perfekt" sein.