| 186 | } |
| 187 | } |
| 188 | void SearchEngineData<MLD>::InitializeUnpackingCache(unsigned number_of_nodes, |
| 189 | unsigned number_of_edges) |
| 190 | { |
| 191 | if (unpacking_cache && unpacking_cache_node_count == number_of_nodes && |
| 192 | unpacking_cache_edge_count == number_of_edges) |
| 193 | return; |
| 194 | |
| 195 | constexpr double kCacheBudgetFraction = 0.10; |
| 196 | constexpr double kL1Fraction = 0.20; |
| 197 | constexpr double kL2Fraction = 0.80; |
| 198 | constexpr size_t kBytesPerNode = 16; |
| 199 | constexpr size_t kBytesPerEdge = 10; |
| 200 | |
| 201 | const size_t graph_memory = static_cast<size_t>(number_of_nodes) * kBytesPerNode + |
| 202 | static_cast<size_t>(number_of_edges) * kBytesPerEdge; |
| 203 | const size_t total_budget = static_cast<size_t>(graph_memory * kCacheBudgetFraction); |
| 204 | const size_t l1_budget = static_cast<size_t>(total_budget * kL1Fraction); |
| 205 | const size_t l2_budget = static_cast<size_t>(total_budget * kL2Fraction); |
| 206 | |
| 207 | unpacking_cache.reset(new MLDUnpackingCache(l1_budget, l2_budget, MLDUnpackingCacheCostFn{})); |
| 208 | unpacking_cache_node_count = number_of_nodes; |
| 209 | unpacking_cache_edge_count = number_of_edges; |
| 210 | } |
| 211 | } // namespace osrm::engine |