-
Notifications
You must be signed in to change notification settings - Fork 55
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GBFS: Performance/Memory Improvements + Vehicle Types #670
Conversation
# Conflicts: # .pkg # .pkg.lock # ui/src/lib/getModeName.ts
include/motis/gbfs/lru_cache.h
Outdated
auto write_lock = std::unique_lock{mutex_}; | ||
if (auto it = cache_map_.find(key); it != cache_map_.end()) { | ||
if (auto const lru_it = | ||
std::find(lru_order_.begin(), lru_order_.end(), key); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
std::find(lru_order_.begin(), lru_order_.end(), key); | |
std::find(lru_order_.begin(), lru_order_.end(), key); |
utl::find
But in general looks expensive in case the cache becomes large?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lru_order_
only stores numbers and I expected the cache size to be <= 1000. Finding a number and moving memory around (in move_to_front
) in <= 8 KB should be fast enough I hope. We could probably limit gbfs_provider_idx_t
(the entries in this vector) to uint16_t
instead of size_t
to make it more compact.
What alternative did you have in mind? For example, I don't think an additional map key -> lru index
is very helpful because the indices of all the entries change every time move_to_front
is called (unless only the first entry is accessed), so keeping that map updated would be expensive.
namespace motis::gbfs { | ||
|
||
template <typename T> | ||
struct partition { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
how is this related to boost::interval_set or boost::interval_map?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unless I'm missing something, I don't think they are related. The GBFS code doesn't use intervals. The vehicle types are just mapped to numbers 0..n (index into the list of vehicle types) for the partitioning.
partition.h implements Partition refinement, which I don't think Boost.Icl does (and I don't see how it would relate to intervals). The idea is that initially, all vehicle types are equal (= a single set containing all vehicle types), then refine
is called for each combination of vehicle types that share some property but are different from all other vehicle types (this includes the form factor (bike, scooter etc.), vehicle types that can be returned at a station (vs. all the other ones that can't be returned there), and geofencing zone rules that are vehicle type specific). If not all vehicle types in a set share that property, the set is split into two sets.
# Conflicts: # .pkg.lock # src/endpoints/routing.cc # src/journey_to_response.cc # src/street_routing.cc
# Conflicts: # .pkg.lock
# Conflicts: # ui/src/lib/i18n/en.ts
# Conflicts: # .pkg.lock # include/motis/endpoints/routing.h # src/endpoints/routing.cc # src/journey_to_response.cc # test/routing_test.cc
# Conflicts: # .pkg.lock
# Conflicts: # .pkg.lock
# Conflicts: # .pkg.lock
* Use `maxTravelTime` to filter results (motis-project#668) * Use 'maxTravelTime' to filter results * Change unit to minutes * Fix formatting * Fix type for MSVC build * Update nigiri dependency * Set limit for maximum travel time * GBFS: Performance/Memory Improvements + Vehicle Types (motis-project#670) * gbfs: partition providers, faster updates, less memory usage * fix vehicle_docks_available * slightly faster geofencing zone mapping * rename provider_cache -> provider_file_infos * ts formatting * formatting * clang fixes * clang fix * clang fixes * trying to fix apple clang * static_cast all the things * review changes * fix include * 65k gbfs providers should be enough * remove obsolete comment * sort vehicle status before diff * fill cache during gbfs update * cleanup * partition vehicle types by form factor + propulsion type * rental api changes (RENTAL mode + form factor + propulsion type) * ui fix * rename provider segment -> products * vehicle type id -> idx * rename more segment -> products * one more r-tree to speed up geofencing zone mapping * clang fix * fix api descriptions * api: add rental provider filter * ui: fix direct connection display for rental connections * return constraint support, allow roundtrip for direct connections * ui formatting * fix missing gbfs data after update * http proxy support * share decompressed bitvecs between routing requests * fix missing initializer --------- Co-authored-by: Felix Gündling <felix.guendling@gmail.com> * replace wheelchair with pedestrianProfile and useRoutedTransfers params (motis-project#683) * replace wheelchair with pedestrianProfile and useRoutedTransfers parameters * fix test * ui: debounce search requests * increase trains limit to support big cities like Paris/London/.. * add timeout option * cli changes (motis-project#685) * cli changes * wip * update nigiri * Update README.md: not beta anymore * update nigiri: speedup ~8% by not finding 24h+ transfers * basic benchmark and QA tooling (motis-project#686) * bench * wip * wip * wip * wip * fix command line flag handling * full dataset test (motis-project#687) * full dataset test * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * body size limit 128M * cmake: Add option to pass flags not used for host tools (motis-project#689) * update nigiri: rt update fixes time travel * more rebostness against invalid delay update data motis-project/nigiri#162 * update nigiri: trim stop time before empty check for interpolation * motis config: fix crash with no parameters * update nigiri: better trip names (motis-project#695) * polish translation * Detailed transfers flag + output exactly what nigiri routed (motis-project#698) * wip * output exactly what nigiri routed * remove logging output * remove unused variable * fix eval * wip * wip * Initial style guide docs/STYLE.md * Fix missing closing tag (motis-project#700) * Fix missing closing tag * Add sections for important tools This adds a section for `strong`, as well as `vector_map` and `vecvec`. * Fix index out of range for stop_times last arrival of multi-section run (motis-project#704) * fix index out of range for stop_times last arrival of multi-section run * follow style guide Co-authored-by: Felix Gündling <felix.guendling@gmail.com> --------- Co-authored-by: Felix Gündling <felix.guendling@gmail.com> * (Mobile) UI improvements (motis-project#705) * ui: move components to lib * ui: make components more responsive * ui: more compact layout * ui: i18n fixes * ui: make toggle button state more visible * ui: error handling, avoid repeated effect triggering * ui: more small screen adjustments * ui: url state handling * ui: show backend error msgs, compact transfer display * UI fixes (motis-project#710) * ui: fall back to black routeTextColor (gtfs spec) * update ui deps * ui: workaround to avoid clickthrough * ui: linting * update nigiri: monotonicity enforcement on utc times (fixes interpolation for frequency expanded trips) * ui changes * Improve formatDuration (motis-project#713) * Update formatDuration.ts * fix formatting * fix formatting * Fix formatting * osr_footpaths: add missing footpaths (motis-project#707) * osr_footpaths: add missing footpaths * update osr (ramp support) * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * formatting --------- Co-authored-by: Michael Kutzner <174690291+MichaelKutzner@users.noreply.github.com> Co-authored-by: Pablo Hoch <pablohoch@users.noreply.github.com> Co-authored-by: Felix Gündling <felix.guendling@gmail.com> Co-authored-by: Felix Gündling <felixguendling@gmail.com> Co-authored-by: Jonah Brüchert <jbb@kaidan.im> Co-authored-by: Traines <git@traines.eu> Co-authored-by: Altonss <66519591+Altonss@users.noreply.github.com>
RENTAL
mode with additional filters for form factors (bike, cargo bike, scooter etc.), propulsion type (human, electric etc.) and providers.rental.returnConstraint
field in the response. This is often used for cargo bikes and car sharing.ttl
field is now processed to only download files when necessary.ttl
is not expired or the contents are unchanged), the existing data is reused.gbfs.cache_size
) are kept in memory. These bitfields are also compressed.Most GBFS providers don't actually use multiple vehicle form factors. Here is an example config for Switzerland, where some providers in Zurich provide bikes and scooters: