Externalized even more of the temporary data structures.

This commit is contained in:
DennisOSRM 2012-04-26 14:03:01 +02:00
parent 44af60563d
commit 8c2bd8bd88
2 changed files with 19 additions and 11 deletions

View File

@ -21,20 +21,23 @@ or see http://www.gnu.org/licenses/agpl.txt.
#ifndef CONTRACTOR_H_INCLUDED #ifndef CONTRACTOR_H_INCLUDED
#define CONTRACTOR_H_INCLUDED #define CONTRACTOR_H_INCLUDED
#include <algorithm> #include <algorithm>
#include <ctime>
#include <limits>
#include <queue>
#include <set>
#include <vector>
#include <stxxl.h>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include "../DataStructures/DynamicGraph.h" #include "../DataStructures/DynamicGraph.h"
#include "../DataStructures/Percent.h" #include "../DataStructures/Percent.h"
#include "../DataStructures/BinaryHeap.h" #include "../DataStructures/BinaryHeap.h"
#include "../Util/OpenMPReplacement.h" #include "../Util/OpenMPReplacement.h"
#include "../Util/StringUtil.h" #include "../Util/StringUtil.h"
#include <ctime>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <limits>
class Contractor { class Contractor {
@ -98,7 +101,7 @@ public:
template<class ContainerT > template<class ContainerT >
Contractor( int nodes, ContainerT& inputEdges) { Contractor( int nodes, ContainerT& inputEdges) {
std::vector< _ImportEdge > edges; stxxl::vector< _ImportEdge > edges;
edges.reserve( 2 * inputEdges.size() ); edges.reserve( 2 * inputEdges.size() );
BOOST_FOREACH(typename ContainerT::value_type & currentEdge, inputEdges) { BOOST_FOREACH(typename ContainerT::value_type & currentEdge, inputEdges) {
_ImportEdge edge; _ImportEdge edge;
@ -169,12 +172,12 @@ public:
} }
} }
} }
std::cout << "ok" << "merged " << edges.size() - edge << " edges out of " << edges.size() << std::endl; std::cout << "merged " << edges.size() - edge << " edges out of " << edges.size() << std::endl;
edges.resize( edge ); edges.resize( edge );
std::vector<_ImportEdge>(edges).swap(edges);
_graph.reset( new _DynamicGraph( nodes, edges ) ); _graph.reset( new _DynamicGraph( nodes, edges ) );
std::vector< _ImportEdge >().swap( edges ); INFO("Finished building dynamic graph");
edges.clear();
// unsigned maxdegree = 0; // unsigned maxdegree = 0;
// NodeID highestNode = 0; // NodeID highestNode = 0;
// //

View File

@ -52,12 +52,15 @@ class DynamicGraph {
m_edges.reserve( m_numNodes * 1.1 ); m_edges.reserve( m_numNodes * 1.1 );
m_edges.resize( m_numNodes ); m_edges.resize( m_numNodes );
} }
DynamicGraph( int nodes, const std::vector< InputEdge > &graph ) template<class ContainerT>
DynamicGraph( int nodes, const ContainerT &graph )
{ {
m_numNodes = nodes; m_numNodes = nodes;
m_numEdges = ( EdgeIterator ) graph.size(); m_numEdges = ( EdgeIterator ) graph.size();
m_nodes.reserve( m_numNodes ); m_nodes.reserve( m_numNodes );
INFO("reserved nodes");
m_nodes.resize( m_numNodes ); m_nodes.resize( m_numNodes );
INFO("resized nodes");
EdgeIterator edge = 0; EdgeIterator edge = 0;
EdgeIterator position = 0; EdgeIterator position = 0;
for ( NodeIterator node = 0; node < m_numNodes; ++node ) { for ( NodeIterator node = 0; node < m_numNodes; ++node ) {
@ -70,7 +73,9 @@ class DynamicGraph {
position += m_nodes[node].edges; position += m_nodes[node].edges;
} }
m_edges.reserve( position * 1.1 ); m_edges.reserve( position * 1.1 );
INFO("reserced edges");
m_edges.resize( position ); m_edges.resize( position );
INFO("resized edges");
edge = 0; edge = 0;
for ( NodeIterator node = 0; node < m_numNodes; ++node ) { for ( NodeIterator node = 0; node < m_numNodes; ++node ) {
for ( EdgeIterator i = m_nodes[node].firstEdge, e = m_nodes[node].firstEdge + m_nodes[node].edges; i != e; ++i ) { for ( EdgeIterator i = m_nodes[node].firstEdge, e = m_nodes[node].firstEdge + m_nodes[node].edges; i != e; ++i ) {