From 4f39c5d766c9babeb1757da9398c45b2e9cc1e56 Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Mon, 12 Dec 2016 13:46:21 +0300 Subject: [PATCH] Traffic cache for routing memory optimization. --- routing/edge_estimator.cpp | 13 +++++++------ routing/routing_session.cpp | 18 ++++++++++++++++-- routing/routing_session.hpp | 2 +- .../routing_tests/applying_traffic_test.cpp | 6 +++++- traffic/traffic_cache.cpp | 17 ++++++++--------- traffic/traffic_cache.hpp | 8 ++++---- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/routing/edge_estimator.cpp b/routing/edge_estimator.cpp index 86c27e8415..4813493c32 100644 --- a/routing/edge_estimator.cpp +++ b/routing/edge_estimator.cpp @@ -43,7 +43,7 @@ public: private: TrafficCache const & m_trafficCache; - shared_ptr m_trafficInfo; + shared_ptr m_trafficColoring; double const m_maxSpeedMPS; }; @@ -55,12 +55,12 @@ CarEdgeEstimator::CarEdgeEstimator(IVehicleModel const & vehicleModel, void CarEdgeEstimator::Start(MwmSet::MwmId const & mwmId) { - m_trafficInfo = m_trafficCache.GetTrafficInfo(mwmId); + m_trafficColoring = m_trafficCache.GetTrafficInfo(mwmId); } void CarEdgeEstimator::Finish() { - m_trafficInfo.reset(); + m_trafficColoring.reset(); } double CarEdgeEstimator::CalcEdgesWeight(uint32_t featureId, RoadGeometry const & road, @@ -77,10 +77,11 @@ double CarEdgeEstimator::CalcEdgesWeight(uint32_t featureId, RoadGeometry const for (uint32_t i = start; i < finish; ++i) { double edgeWeight = TimeBetweenSec(road.GetPoint(i), road.GetPoint(i + 1), speedMPS); - if (m_trafficInfo) + if (m_trafficColoring) { - SpeedGroup const speedGroup = - m_trafficInfo->GetSpeedGroup(TrafficInfo::RoadSegmentId(featureId, i, dir)); + auto const it = m_trafficColoring->find(TrafficInfo::RoadSegmentId(featureId, i, dir)); + SpeedGroup const speedGroup = (it == m_trafficColoring->cend()) ? SpeedGroup::Unknown + : it->second; ASSERT_LESS(speedGroup, SpeedGroup::Count, ()); edgeWeight *= CalcTrafficFactor(speedGroup); } diff --git a/routing/routing_session.cpp b/routing/routing_session.cpp index a22b546e49..133e5b8c83 100644 --- a/routing/routing_session.cpp +++ b/routing/routing_session.cpp @@ -589,9 +589,23 @@ void RoutingSession::OnTrafficInfoClear() void RoutingSession::OnTrafficInfoAdded(TrafficInfo && info) { + ASSERT_EQUAL(kSpeedGroupThresholdPercentage[static_cast(SpeedGroup::G5)], 100, ()); + ASSERT_EQUAL(kSpeedGroupThresholdPercentage[static_cast(SpeedGroup::Unknown)], 100, ()); + + // The code below is memory optimization. Edges with traffic SpeedGroup::G5 and + // SpeedGroup::Unknown are 95% of all edges but they are not used in routing now. + // So we don't need to keep the information in TrafficCache. + TrafficInfo::Coloring const & fullColoring = info.GetColoring(); + TrafficInfo::Coloring coloring; + for (auto const & kv : fullColoring) + { + if (kv.second != SpeedGroup::G5 && kv.second != SpeedGroup::Unknown) + coloring.insert(kv); + } + threads::MutexGuard guard(m_routingSessionMutex); UNUSED_VALUE(guard); - Set(move(info)); + Set(info.GetMwmId(), move(coloring)); } void RoutingSession::OnTrafficInfoRemoved(MwmSet::MwmId const & mwmId) @@ -601,7 +615,7 @@ void RoutingSession::OnTrafficInfoRemoved(MwmSet::MwmId const & mwmId) Remove(mwmId); } -shared_ptr RoutingSession::GetTrafficInfo(MwmSet::MwmId const & mwmId) const +shared_ptr RoutingSession::GetTrafficInfo(MwmSet::MwmId const & mwmId) const { threads::MutexGuard guard(m_routingSessionMutex); UNUSED_VALUE(guard); diff --git a/routing/routing_session.hpp b/routing/routing_session.hpp index e7587ab0ce..471a7ab7c4 100644 --- a/routing/routing_session.hpp +++ b/routing/routing_session.hpp @@ -160,7 +160,7 @@ public: void OnTrafficInfoRemoved(MwmSet::MwmId const & mwmId) override; // TrafficCache overrides: - shared_ptr GetTrafficInfo(MwmSet::MwmId const & mwmId) const override; + shared_ptr GetTrafficInfo(MwmSet::MwmId const & mwmId) const override; private: struct DoReadyCallback diff --git a/routing/routing_tests/applying_traffic_test.cpp b/routing/routing_tests/applying_traffic_test.cpp index e19258df57..1781216cc4 100644 --- a/routing/routing_tests/applying_traffic_test.cpp +++ b/routing/routing_tests/applying_traffic_test.cpp @@ -92,7 +92,11 @@ public: class TrafficCacheTest : public TrafficCache { public: - void SetTrafficInfo(traffic::TrafficInfo && info) { Set(move(info)); } + void SetTrafficInfo(TrafficInfo && info) + { + TrafficInfo::Coloring coloring = info.GetColoring(); + Set(info.GetMwmId(), move(coloring)); + } }; ApplyingTrafficTest() { classificator::Load(); } diff --git a/traffic/traffic_cache.cpp b/traffic/traffic_cache.cpp index ec0373b7e6..71b37f6ba2 100644 --- a/traffic/traffic_cache.cpp +++ b/traffic/traffic_cache.cpp @@ -2,22 +2,21 @@ namespace traffic { -void TrafficCache::Set(TrafficInfo && info) +void TrafficCache::Set(MwmSet::MwmId const & mwmId, TrafficInfo::Coloring && coloring) { - MwmSet::MwmId const mwmId = info.GetMwmId(); - m_trafficInfo[mwmId] = make_shared(move(info)); + m_trafficColoring[mwmId] = make_shared(move(coloring)); } -void TrafficCache::Remove(MwmSet::MwmId const & mwmId) { m_trafficInfo.erase(mwmId); } +void TrafficCache::Remove(MwmSet::MwmId const & mwmId) { m_trafficColoring.erase(mwmId); } -shared_ptr TrafficCache::GetTrafficInfo(MwmSet::MwmId const & mwmId) const +shared_ptr TrafficCache::GetTrafficInfo(MwmSet::MwmId const & mwmId) const { - auto it = m_trafficInfo.find(mwmId); + auto it = m_trafficColoring.find(mwmId); - if (it == m_trafficInfo.cend()) - return shared_ptr(); + if (it == m_trafficColoring.cend()) + return shared_ptr(); return it->second; } -void TrafficCache::Clear() { m_trafficInfo.clear(); } +void TrafficCache::Clear() { m_trafficColoring.clear(); } } // namespace traffic diff --git a/traffic/traffic_cache.hpp b/traffic/traffic_cache.hpp index ba79312a6f..4412f20cb6 100644 --- a/traffic/traffic_cache.hpp +++ b/traffic/traffic_cache.hpp @@ -11,17 +11,17 @@ namespace traffic class TrafficCache { public: - TrafficCache() : m_trafficInfo() {} + TrafficCache() : m_trafficColoring() {} virtual ~TrafficCache() = default; - virtual shared_ptr GetTrafficInfo(MwmSet::MwmId const & mwmId) const; + virtual shared_ptr GetTrafficInfo(MwmSet::MwmId const & mwmId) const; protected: - void Set(traffic::TrafficInfo && info); + void Set(MwmSet::MwmId const & mwmId, TrafficInfo::Coloring && mwmIdAndColoring); void Remove(MwmSet::MwmId const & mwmId); void Clear(); private: - map> m_trafficInfo; + map> m_trafficColoring; }; } // namespace traffic