From 1b4779a58c45507b21f477314b4788473ef9ccfa Mon Sep 17 00:00:00 2001 From: "Daniel J. Hofmann" Date: Mon, 14 Nov 2016 23:43:24 +0100 Subject: [PATCH] Avoids Shuffling Data Around for Nothing, closes 3306 --- include/util/graph_loader.hpp | 26 ++++++++++++------------ src/extractor/extractor.cpp | 37 ++++++++++++++++------------------- src/tools/components.cpp | 15 ++++++-------- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/include/util/graph_loader.hpp b/include/util/graph_loader.hpp index da4844884..df0e739ff 100644 --- a/include/util/graph_loader.hpp +++ b/include/util/graph_loader.hpp @@ -20,6 +20,7 @@ #include #include +#include #include namespace osrm @@ -58,14 +59,15 @@ inline unsigned loadRestrictionsFromFile(std::istream &input_stream, /** * Reads the beginning of an .osrm file and produces: - * - list of barrier nodes - * - list of traffic lights + * - barrier nodes + * - traffic lights * - nodes indexed by their internal (non-osm) id */ -inline NodeID loadNodesFromFile(std::istream &input_stream, - std::vector &barrier_node_list, - std::vector &traffic_light_node_list, - std::vector &node_array) +template +NodeID loadNodesFromFile(std::istream &input_stream, + BarrierOutIter barriers, + TrafficSignalsOutIter traffic_signals, + std::vector &node_array) { const FingerPrint fingerprint_valid = FingerPrint::GetValid(); FingerPrint fingerprint_loaded; @@ -89,20 +91,20 @@ inline NodeID loadNodesFromFile(std::istream &input_stream, input_stream.read(reinterpret_cast(¤t_node), sizeof(extractor::ExternalMemoryNode)); node_array.emplace_back(current_node.lon, current_node.lat, current_node.node_id); + if (current_node.barrier) { - barrier_node_list.emplace_back(i); + *barriers = i; + ++barriers; } + if (current_node.traffic_lights) { - traffic_light_node_list.emplace_back(i); + *traffic_signals = i; + ++traffic_signals; } } - // tighten vector sizes - barrier_node_list.shrink_to_fit(); - traffic_light_node_list.shrink_to_fit(); - return n; } diff --git a/src/extractor/extractor.cpp b/src/extractor/extractor.cpp index 7ad142f7f..03fff39a9 100644 --- a/src/extractor/extractor.cpp +++ b/src/extractor/extractor.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include //partial_sum #include @@ -409,33 +410,29 @@ std::shared_ptr Extractor::LoadRestrictionMap() \brief Load node based graph from .osrm file */ std::shared_ptr -Extractor::LoadNodeBasedGraph(std::unordered_set &barrier_nodes, - std::unordered_set &traffic_lights, +Extractor::LoadNodeBasedGraph(std::unordered_set &barriers, + std::unordered_set &traffic_signals, std::vector &internal_to_external_node_map) { - std::vector edge_list; + boost::filesystem::ifstream stream(config.output_file_name, std::ios::binary); - boost::filesystem::ifstream input_stream(config.output_file_name, - std::ios::in | std::ios::binary); + if (!stream) + { + throw util::exception("Unable to open " + config.output_file_name + + " trying to read the node based graph"); + } + + auto barriers_iter = inserter(barriers, end(barriers)); + auto traffic_signals_iter = inserter(traffic_signals, end(traffic_signals)); - std::vector barrier_list; - std::vector traffic_light_list; NodeID number_of_node_based_nodes = util::loadNodesFromFile( - input_stream, barrier_list, traffic_light_list, internal_to_external_node_map); + stream, barriers_iter, traffic_signals_iter, internal_to_external_node_map); - util::SimpleLogger().Write() << " - " << barrier_list.size() << " bollard nodes, " - << traffic_light_list.size() << " traffic lights"; + util::SimpleLogger().Write() << " - " << barriers.size() << " bollard nodes, " + << traffic_signals.size() << " traffic lights"; - // insert into unordered sets for fast lookup - barrier_nodes.insert(barrier_list.begin(), barrier_list.end()); - traffic_lights.insert(traffic_light_list.begin(), traffic_light_list.end()); - - barrier_list.clear(); - barrier_list.shrink_to_fit(); - traffic_light_list.clear(); - traffic_light_list.shrink_to_fit(); - - util::loadEdgesFromFile(input_stream, edge_list); + std::vector edge_list; + util::loadEdgesFromFile(stream, edge_list); if (edge_list.empty()) { diff --git a/src/tools/components.cpp b/src/tools/components.cpp index 157de2ba2..d46ccf0b7 100644 --- a/src/tools/components.cpp +++ b/src/tools/components.cpp @@ -9,6 +9,7 @@ #include "util/typedefs.hpp" #include +#include #if defined(__APPLE__) || defined(_WIN32) #include @@ -53,24 +54,20 @@ std::size_t loadGraph(const char *path, std::vector &coordinate_list, std::vector &graph_edge_list) { - std::ifstream input_stream(path, std::ifstream::in | std::ifstream::binary); - if (!input_stream.is_open()) + std::ifstream stream(path, std::ifstream::binary); + if (!stream) { throw util::exception("Cannot open osrm file"); } // load graph data std::vector edge_list; - std::vector traffic_light_node_list; - std::vector barrier_node_list; - auto number_of_nodes = util::loadNodesFromFile( - input_stream, barrier_node_list, traffic_light_node_list, coordinate_list); + auto nop = boost::make_function_output_iterator([](auto) {}); - util::loadEdgesFromFile(input_stream, edge_list); + auto number_of_nodes = util::loadNodesFromFile(stream, nop, nop, coordinate_list); - traffic_light_node_list.clear(); - traffic_light_node_list.shrink_to_fit(); + util::loadEdgesFromFile(stream, edge_list); // Building an node-based graph for (const auto &input_edge : edge_list)