Skip to content

foreach: ways accumulating #568

Description

@mmd-osm

I've noticed that the following query gets slower over time, obviously accumulating ways over time. This is most obvious in Way_Geometry_Store, where an increasing numbers of ways is being prepared.

When running the query for a single FIPS value (e.g. area["nist:fips_code"="16011"];), only a single index and two ways need to be prepared in Way_Geometry_Store, supporting the idea that foreach doesn't clean up some data here.

I believe this is caused by a missing clear() in Area_Constraint::get_ranges which can be fixed by mmd-osm@debc357
This brings the query runtime down from >2h (query below times out) to 50s.

Testing based on commit 021dfdb

Query

[timeout:7200]
[out:csv("nist:fips_code", fips, name, total)];


// All counties with FIPS 6-4 county codes
area["nist:fips_code"~"^[0-9]{5}$"];

// Count the pharmacies in each county
foreach->.county(
  .county out tags;
  // Collect all matching features in the current county
  way["amenity"="fuel"](area.county);
  
  // Sum nodes, ways, and relations together and group by county
  make count fips = county.set(t["nist:fips_code"]),
             name = county.set(t["name"]),
             total = count(nodes) + count(ways) + count(relations);
//  out;
)

Logging

Adding small instrumentation to show the number of indices and ways whenn calling the Way_Geometry_Store constructor:

diff --git a/src/overpass_api/data/way_geometry_store.cc b/src/overpass_api/data/way_geometry_store.cc
index 75d6de37..b8f1a499 100644
--- a/src/overpass_api/data/way_geometry_store.cc
+++ b/src/overpass_api/data/way_geometry_store.cc
@@ -92,6 +92,9 @@ std::map< Uint32_Index, std::vector< Node_Skeleton > > small_way_members
 Way_Geometry_Store::Way_Geometry_Store
     (const std::map< Uint31_Index, std::vector< Way_Skeleton > >& ways, const Statement& query, Resource_Manager& rman)
 {
+long total = 0;
+for (const auto &r: ways) total+=r.second.size();
+std::cout << "Constructor called with #ways: " << total << " in " << ways.size() <<" indices\n";
   // Retrieve all nodes referred by the ways.
   std::map< Uint32_Index, std::vector< Node_Skeleton > > way_members_ = small_way_members(&query, rman, ways);

Output

Number of ways and indices keeps increasing over time:

nist:fips_code	fips	name	total
02016		Aleutians West Census Area	
Constructor called with #ways: 2 in 2 indices
Constructor called with #ways: 0 in 0 indices
60010		Eastern District	
Constructor called with #ways: 4 in 3 indices
Constructor called with #ways: 0 in 0 indices
60050		Western District	
Constructor called with #ways: 4 in 3 indices
Constructor called with #ways: 0 in 0 indices
60020		Manu'a District	
Constructor called with #ways: 4 in 3 indices
Constructor called with #ways: 0 in 0 indices
60030		Rose Atoll	
Constructor called with #ways: 4 in 3 indices
Constructor called with #ways: 0 in 0 indices
02185		North Slope	
Constructor called with #ways: 6 in 5 indices
Constructor called with #ways: 0 in 0 indices
15003		Honolulu County	
Constructor called with #ways: 51 in 41 indices
Constructor called with #ways: 0 in 0 indices
02013		Aleutians East	
Constructor called with #ways: 56 in 44 indices
Constructor called with #ways: 0 in 0 indices
02050		Bethel	
[...]
Constructor called with #ways: 12689 in 10100 indices
Constructor called with #ways: 0 in 0 indices
47105		Loudon County	
Constructor called with #ways: 12689 in 10100 indices
Constructor called with #ways: 0 in 0 indices
47123		Monroe County	
Constructor called with #ways: 12689 in 10100 indices
Constructor called with #ways: 0 in 0 indices
37039		Cherokee County	
Constructor called with #ways: 12692 in 10103 indices
Constructor called with #ways: 0 in 0 indices
37043		Clay County	
Constructor called with #ways: 12692 in 10103 indices
Constructor called with #ways: 0 in 0 indices
37075		Graham County	
Constructor called with #ways: 12692 in 10103 indices
Constructor called with #ways: 0 in 0 indices
37173		Swain County	
Constructor called with #ways: 12693 in 10104 indices
Constructor called with #ways: 0 in 0 indices
47133		Overton County	
Constructor called with #ways: 12693 in 10104 indices
Constructor called with #ways: 0
[...]

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions