Partial refactoring

This commit is contained in:
DennisOSRM 2013-07-22 16:32:19 +02:00
parent c5db4dc15f
commit 0367399c89
2 changed files with 65 additions and 56 deletions

View File

@ -30,9 +30,9 @@ or see http://www.gnu.org/licenses/agpl.txt.
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <fstream>
#include <iostream> #include <iostream>
#include <fstream>
#include <string>
#include <vector> #include <vector>
typedef EdgeBasedGraphFactory::EdgeBasedNode RTreeLeaf; typedef EdgeBasedGraphFactory::EdgeBasedNode RTreeLeaf;
@ -40,10 +40,14 @@ typedef EdgeBasedGraphFactory::EdgeBasedNode RTreeLeaf;
class NodeInformationHelpDesk : boost::noncopyable{ class NodeInformationHelpDesk : boost::noncopyable{
public: public:
NodeInformationHelpDesk( NodeInformationHelpDesk(
const char* ramIndexInput, const std::string & ramIndexInput,
const char* fileIndexInput, const std::string & fileIndexInput,
const std::string & nodes_filename,
const std::string & edges_filename,
const unsigned number_of_nodes, const unsigned number_of_nodes,
const unsigned crc) : number_of_nodes(number_of_nodes), checkSum(crc) { const unsigned check_sum
) : number_of_nodes(number_of_nodes), check_sum(check_sum)
{
read_only_rtree = new StaticRTree<RTreeLeaf>( read_only_rtree = new StaticRTree<RTreeLeaf>(
ramIndexInput, ramIndexInput,
fileIndexInput fileIndexInput
@ -52,6 +56,8 @@ public:
0 == coordinateVector.size(), 0 == coordinateVector.size(),
"Coordinate vector not empty" "Coordinate vector not empty"
); );
LoadNodesAndEdges(nodes_filename, edges_filename);
} }
//Todo: Shared memory mechanism //Todo: Shared memory mechanism
@ -59,41 +65,6 @@ public:
delete read_only_rtree; delete read_only_rtree;
} }
void initNNGrid(
std::ifstream& nodesInstream,
std::ifstream& edgesInStream
) {
DEBUG("Loading node data");
NodeInfo b;
while(!nodesInstream.eof()) {
nodesInstream.read((char *)&b, sizeof(NodeInfo));
coordinateVector.push_back(_Coordinate(b.lat, b.lon));
}
std::vector<_Coordinate>(coordinateVector).swap(coordinateVector);
nodesInstream.close();
DEBUG("Loading edge data");
unsigned numberOfOrigEdges(0);
edgesInStream.read((char*)&numberOfOrigEdges, sizeof(unsigned));
origEdgeData_viaNode.resize(numberOfOrigEdges);
origEdgeData_nameID.resize(numberOfOrigEdges);
origEdgeData_turnInstruction.resize(numberOfOrigEdges);
OriginalEdgeData deserialized_originalEdgeData;
for(unsigned i = 0; i < numberOfOrigEdges; ++i) {
edgesInStream.read(
(char*)&(deserialized_originalEdgeData),
sizeof(OriginalEdgeData)
);
origEdgeData_viaNode[i] = deserialized_originalEdgeData.viaNode;
origEdgeData_nameID[i] = deserialized_originalEdgeData.nameID;
origEdgeData_turnInstruction[i] = deserialized_originalEdgeData.turnInstruction;
}
edgesInStream.close();
DEBUG("Loaded " << numberOfOrigEdges << " orig edges");
DEBUG("Opening NN indices");
}
inline int getLatitudeOfNode(const unsigned id) const { inline int getLatitudeOfNode(const unsigned id) const {
const NodeID node = origEdgeData_viaNode.at(id); const NodeID node = origEdgeData_viaNode.at(id);
return coordinateVector.at(node).lat; return coordinateVector.at(node).lat;
@ -147,10 +118,50 @@ public:
} }
inline unsigned GetCheckSum() const { inline unsigned GetCheckSum() const {
return checkSum; return check_sum;
} }
private: private:
void LoadNodesAndEdges(
const std::string & nodes_file,
const std::string & edges_file
) {
std::ifstream nodes_input_stream(nodes_file.c_str(), std::ios::binary);
if(!nodes_input_stream) { ERR(nodes_file << " not found"); }
std::ifstream edges_input_stream(edges_file.c_str(), std::ios::binary);
if(!edges_input_stream) { ERR(edges_file << " not found"); }
DEBUG("Loading node data");
NodeInfo b;
while(!nodes_input_stream.eof()) {
nodes_input_stream.read((char *)&b, sizeof(NodeInfo));
coordinateVector.push_back(_Coordinate(b.lat, b.lon));
}
std::vector<_Coordinate>(coordinateVector).swap(coordinateVector);
nodes_input_stream.close();
DEBUG("Loading edge data");
unsigned numberOfOrigEdges(0);
edges_input_stream.read((char*)&numberOfOrigEdges, sizeof(unsigned));
origEdgeData_viaNode.resize(numberOfOrigEdges);
origEdgeData_nameID.resize(numberOfOrigEdges);
origEdgeData_turnInstruction.resize(numberOfOrigEdges);
OriginalEdgeData deserialized_originalEdgeData;
for(unsigned i = 0; i < numberOfOrigEdges; ++i) {
edges_input_stream.read(
(char*)&(deserialized_originalEdgeData),
sizeof(OriginalEdgeData)
);
origEdgeData_viaNode[i] = deserialized_originalEdgeData.viaNode;
origEdgeData_nameID[i] = deserialized_originalEdgeData.nameID;
origEdgeData_turnInstruction[i] = deserialized_originalEdgeData.turnInstruction;
}
edges_input_stream.close();
DEBUG("Loaded " << numberOfOrigEdges << " orig edges");
DEBUG("Opening NN indices");
}
std::vector<_Coordinate> coordinateVector; std::vector<_Coordinate> coordinateVector;
std::vector<NodeID> origEdgeData_viaNode; std::vector<NodeID> origEdgeData_viaNode;
std::vector<unsigned> origEdgeData_nameID; std::vector<unsigned> origEdgeData_nameID;
@ -158,7 +169,7 @@ private:
StaticRTree<EdgeBasedGraphFactory::EdgeBasedNode> * read_only_rtree; StaticRTree<EdgeBasedGraphFactory::EdgeBasedNode> * read_only_rtree;
const unsigned number_of_nodes; const unsigned number_of_nodes;
const unsigned checkSum; const unsigned check_sum;
}; };
#endif /*NODEINFORMATIONHELPDESK_H_*/ #endif /*NODEINFORMATIONHELPDESK_H_*/

View File

@ -45,6 +45,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>
#include <queue> #include <queue>
#include <string>
#include <vector> #include <vector>
//tuning parameters //tuning parameters
@ -275,17 +276,16 @@ private:
std::vector<TreeNode> m_search_tree; std::vector<TreeNode> m_search_tree;
uint64_t m_element_count; uint64_t m_element_count;
std::string m_leaf_node_filename; const std::string m_leaf_node_filename;
public: public:
//Construct a packed Hilbert-R-Tree with Kamel-Faloutsos algorithm [1] //Construct a packed Hilbert-R-Tree with Kamel-Faloutsos algorithm [1]
explicit StaticRTree( explicit StaticRTree(
std::vector<DataT> & input_data_vector, std::vector<DataT> & input_data_vector,
const char * tree_node_filename, const std::string tree_node_filename,
const char * leaf_node_filename const std::string leaf_node_filename
) : )
m_element_count(input_data_vector.size()), : m_element_count(input_data_vector.size()),
m_leaf_node_filename(leaf_node_filename) m_leaf_node_filename(leaf_node_filename)
{ {
INFO("constructing r-tree of " << m_element_count << " elements"); INFO("constructing r-tree of " << m_element_count << " elements");
double time1 = get_timestamp(); double time1 = get_timestamp();
@ -305,7 +305,7 @@ public:
} }
//open leaf file //open leaf file
std::ofstream leaf_node_file(leaf_node_filename, std::ios::binary); std::ofstream leaf_node_file(leaf_node_filename.c_str(), std::ios::binary);
leaf_node_file.write((char*) &m_element_count, sizeof(uint64_t)); leaf_node_file.write((char*) &m_element_count, sizeof(uint64_t));
//sort the hilbert-value representatives //sort the hilbert-value representatives
@ -386,7 +386,7 @@ public:
} }
//open tree file //open tree file
std::ofstream tree_node_file(tree_node_filename, std::ios::binary); std::ofstream tree_node_file(tree_node_filename.c_str(), std::ios::binary);
uint32_t size_of_tree = m_search_tree.size(); uint32_t size_of_tree = m_search_tree.size();
BOOST_ASSERT_MSG(0 < size_of_tree, "tree empty"); BOOST_ASSERT_MSG(0 < size_of_tree, "tree empty");
tree_node_file.write((char *)&size_of_tree, sizeof(uint32_t)); tree_node_file.write((char *)&size_of_tree, sizeof(uint32_t));
@ -399,13 +399,11 @@ public:
//Read-only operation for queries //Read-only operation for queries
explicit StaticRTree( explicit StaticRTree(
const char * node_filename, const std::string & node_filename,
const char * leaf_filename const std::string & leaf_filename
) : m_leaf_node_filename(leaf_filename) { ) : m_leaf_node_filename(leaf_filename) {
//INFO("Loading nodes: " << node_filename);
//INFO("opening leafs: " << leaf_filename);
//open tree node file and load into RAM. //open tree node file and load into RAM.
std::ifstream tree_node_file(node_filename, std::ios::binary); std::ifstream tree_node_file(node_filename.c_str(), std::ios::binary);
uint32_t tree_size = 0; uint32_t tree_size = 0;
tree_node_file.read((char*)&tree_size, sizeof(uint32_t)); tree_node_file.read((char*)&tree_size, sizeof(uint32_t));
//INFO("reading " << tree_size << " tree nodes in " << (sizeof(TreeNode)*tree_size) << " bytes"); //INFO("reading " << tree_size << " tree nodes in " << (sizeof(TreeNode)*tree_size) << " bytes");
@ -414,7 +412,7 @@ public:
tree_node_file.close(); tree_node_file.close();
//open leaf node file and store thread specific pointer //open leaf node file and store thread specific pointer
std::ifstream leaf_node_file(leaf_filename, std::ios::binary); std::ifstream leaf_node_file(leaf_filename.c_str(), std::ios::binary);
leaf_node_file.read((char*)&m_element_count, sizeof(uint64_t)); leaf_node_file.read((char*)&m_element_count, sizeof(uint64_t));
leaf_node_file.close(); leaf_node_file.close();