make sure any data structure is only loaded once. saves roughly 25% of RAM and starts up 10% faster on benchmark instances.
This commit is contained in:
		
							parent
							
								
									860e73a633
								
							
						
					
					
						commit
						5f6cac9155
					
				| @ -23,6 +23,7 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| 
 | ||||
| #include <fstream> | ||||
| 
 | ||||
| #include "ObjectForPluginStruct.h" | ||||
| #include "BasePlugin.h" | ||||
| #include "RouteParameters.h" | ||||
| 
 | ||||
| @ -33,14 +34,9 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
|  */ | ||||
| class LocatePlugin : public BasePlugin { | ||||
| public: | ||||
| 	LocatePlugin(std::string ramIndexPath, std::string fileIndexPath, std::string nodesPath) { | ||||
| 		nodeHelpDesk = new NodeInformationHelpDesk(ramIndexPath.c_str(), fileIndexPath.c_str()); | ||||
| 		ifstream nodesInStream(nodesPath.c_str(), ios::binary); | ||||
| 		nodeHelpDesk->initNNGrid(nodesInStream); | ||||
| 	} | ||||
| 	~LocatePlugin() { | ||||
| 		delete nodeHelpDesk; | ||||
| 	} | ||||
|     LocatePlugin(ObjectsForQueryStruct * objects) { | ||||
|         nodeHelpDesk = objects->nodeHelpDesk; | ||||
|     } | ||||
| 	std::string GetDescriptor() { return std::string("locate"); } | ||||
| 	std::string GetVersionString() { return std::string("0.3 (DL)"); } | ||||
| 	void HandleRequest(RouteParameters routeParameters, http::Reply& reply) { | ||||
|  | ||||
| @ -25,6 +25,9 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| 
 | ||||
| #include "BasePlugin.h" | ||||
| #include "RouteParameters.h" | ||||
| 
 | ||||
| #include "ObjectForPluginStruct.h" | ||||
| 
 | ||||
| #include "../DataStructures/NodeInformationHelpDesk.h" | ||||
| #include "../DataStructures/HashTable.h" | ||||
| #include "../Util/StrIngUtil.h" | ||||
| @ -34,17 +37,12 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
|  */ | ||||
| class NearestPlugin : public BasePlugin { | ||||
| public: | ||||
|     NearestPlugin(std::string ramIndexPath, std::string fileIndexPath, std::string nodesPath) { | ||||
|         nodeHelpDesk = new NodeInformationHelpDesk(ramIndexPath.c_str(), fileIndexPath.c_str()); | ||||
|         ifstream nodesInStream(nodesPath.c_str(), ios::binary); | ||||
|         nodeHelpDesk->initNNGrid(nodesInStream); | ||||
|     NearestPlugin(ObjectsForQueryStruct * objects) { | ||||
|         nodeHelpDesk = objects->nodeHelpDesk; | ||||
|         descriptorTable.Set("", 0); //default descriptor
 | ||||
|         descriptorTable.Set("kml", 0); | ||||
|         descriptorTable.Set("json", 1); | ||||
|     } | ||||
|     ~NearestPlugin() { | ||||
|         delete nodeHelpDesk; | ||||
|     } | ||||
|     std::string GetDescriptor() { return std::string("nearest"); } | ||||
|     std::string GetVersionString() { return std::string("0.3 (DL)"); } | ||||
|     void HandleRequest(RouteParameters routeParameters, http::Reply& reply) { | ||||
|  | ||||
							
								
								
									
										77
									
								
								Plugins/ObjectForPluginStruct.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								Plugins/ObjectForPluginStruct.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| /*
 | ||||
|     open source routing machine | ||||
|     Copyright (C) Dennis Luxen, others 2010 | ||||
| 
 | ||||
| This program is free software; you can redistribute it and/or modify | ||||
| it under the terms of the GNU AFFERO General Public License as published by | ||||
| the Free Software Foundation; either version 3 of the License, or | ||||
| any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU Affero General Public License | ||||
| along with this program; if not, write to the Free Software | ||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| or see http://www.gnu.org/licenses/agpl.txt.
 | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #ifndef OBJECTFORPLUGINSTRUCT_H_ | ||||
| #define OBJECTFORPLUGINSTRUCT_H_ | ||||
| 
 | ||||
| #include "../DataStructures/StaticGraph.h" | ||||
| #include "../Util/GraphLoader.h" | ||||
| 
 | ||||
| typedef ContractionCleanup::Edge::EdgeData EdgeData; | ||||
| typedef StaticGraph<EdgeData>::InputEdge InputEdge; | ||||
| 
 | ||||
| struct ObjectsForQueryStruct { | ||||
|     ObjectsForQueryStruct(std::string hsgrPath, std::string ramIndexPath, std::string fileIndexPath, std::string nodesPath, std::string namesPath, std::string psd = "route") { | ||||
|         std::cout << "[objects] loading query data structures ..." << std::flush; | ||||
|         //Init nearest neighbor data structure
 | ||||
|         ifstream nodesInStream(nodesPath.c_str(), ios::binary); | ||||
|         nodeHelpDesk = new NodeInformationHelpDesk(ramIndexPath.c_str(), fileIndexPath.c_str()); | ||||
|         nodeHelpDesk->initNNGrid(nodesInStream); | ||||
| 
 | ||||
|         ifstream hsgrInStream(hsgrPath.c_str(), ios::binary); | ||||
|         //Deserialize road network graph
 | ||||
|         std::vector< InputEdge> * edgeList = new std::vector< InputEdge>(); | ||||
|         readHSGRFromStream(hsgrInStream, edgeList); | ||||
|         graph = new StaticGraph<EdgeData>(nodeHelpDesk->getNumberOfNodes()-1, *edgeList); | ||||
|         delete edgeList; | ||||
| 
 | ||||
|         //deserialize street name list
 | ||||
|         ifstream namesInStream(namesPath.c_str(), ios::binary); | ||||
|         unsigned size = 0; | ||||
|         namesInStream.read((char *)&size, sizeof(unsigned)); | ||||
|         names = new std::vector<std::string>(); | ||||
| 
 | ||||
|         char buf[1024]; | ||||
|         for(unsigned i = 0; i < size; i++) { | ||||
|             unsigned sizeOfString = 0; | ||||
|             namesInStream.read((char *)&sizeOfString, sizeof(unsigned)); | ||||
|             memset(buf, 0, 1024*sizeof(char)); | ||||
|             namesInStream.read(buf, sizeOfString); | ||||
|             std::string currentStreetName(buf); | ||||
|             names->push_back(currentStreetName); | ||||
|         } | ||||
|         hsgrInStream.close(); | ||||
|         namesInStream.close(); | ||||
|         std::cout << "ok" << std::endl; | ||||
|     } | ||||
| 
 | ||||
|     ~ObjectsForQueryStruct() { | ||||
|         delete names; | ||||
|         delete graph; | ||||
|         delete nodeHelpDesk; | ||||
|     } | ||||
| 
 | ||||
|     NodeInformationHelpDesk * nodeHelpDesk; | ||||
|     std::vector<std::string> * names; | ||||
|     StaticGraph<EdgeData> * graph; | ||||
| }; | ||||
| 
 | ||||
| #endif /* OBJECTFORPLUGINSTRUCT_H_ */ | ||||
| @ -27,6 +27,8 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| #include <string> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include "ObjectForPluginStruct.h" | ||||
| 
 | ||||
| #include "BaseDescriptor.h" | ||||
| #include "BasePlugin.h" | ||||
| #include "RouteParameters.h" | ||||
| @ -37,56 +39,24 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| #include "../DataStructures/StaticGraph.h" | ||||
| #include "../DataStructures/SearchEngine.h" | ||||
| 
 | ||||
| #include "../Util/GraphLoader.h" | ||||
| #include "../Util/StrIngUtil.h" | ||||
| 
 | ||||
| typedef ContractionCleanup::Edge::EdgeData EdgeData; | ||||
| typedef StaticGraph<EdgeData>::InputEdge InputEdge; | ||||
| 
 | ||||
| class RoutePlugin : public BasePlugin { | ||||
| public: | ||||
|     RoutePlugin(std::string hsgrPath, std::string ramIndexPath, std::string fileIndexPath, std::string nodesPath, std::string namesPath, std::string psd = "route") { | ||||
|         //Init nearest neighbor data structure
 | ||||
|         nodeHelpDesk = new NodeInformationHelpDesk(ramIndexPath.c_str(), fileIndexPath.c_str()); | ||||
|         ifstream nodesInStream(nodesPath.c_str(), ios::binary); | ||||
|         ifstream hsgrInStream(hsgrPath.c_str(), ios::binary); | ||||
|         nodeHelpDesk->initNNGrid(nodesInStream); | ||||
| 
 | ||||
|         //Deserialize road network graph
 | ||||
|         std::vector< InputEdge> * edgeList = new std::vector< InputEdge>(); | ||||
|         readHSGRFromStream(hsgrInStream, edgeList); | ||||
|         hsgrInStream.close(); | ||||
|         graph = new StaticGraph<EdgeData>(nodeHelpDesk->getNumberOfNodes()-1, *edgeList); | ||||
|         delete edgeList; | ||||
|     RoutePlugin(ObjectsForQueryStruct * objects, std::string psd = "route") : pluginDescriptorString(psd) { | ||||
|         nodeHelpDesk = objects->nodeHelpDesk; | ||||
|         graph = objects->graph; | ||||
|         names = objects->names; | ||||
| 
 | ||||
|         //deserialize street name list
 | ||||
|         ifstream namesInStream(namesPath.c_str(), ios::binary); | ||||
|         unsigned size = 0; | ||||
|         namesInStream.read((char *)&size, sizeof(unsigned)); | ||||
|         names = new std::vector<std::string>(); | ||||
| 
 | ||||
|         char buf[1024]; | ||||
|         for(unsigned i = 0; i < size; i++) { | ||||
|             unsigned sizeOfString = 0; | ||||
|             namesInStream.read((char *)&sizeOfString, sizeof(unsigned)); | ||||
|             memset(buf, 0, 1024*sizeof(char)); | ||||
|             namesInStream.read(buf, sizeOfString); | ||||
|             std::string currentStreetName(buf); | ||||
|             names->push_back(currentStreetName); | ||||
|         } | ||||
| 
 | ||||
|         //init complete search engine
 | ||||
|         sEngine = new SearchEngine<EdgeData, StaticGraph<EdgeData> >(graph, nodeHelpDesk, names); | ||||
|         descriptorTable.Set("", 0); //default descriptor
 | ||||
|         descriptorTable.Set("kml", 0); | ||||
|         descriptorTable.Set("json", 1); | ||||
|         pluginDescriptorString = psd; | ||||
|     } | ||||
| 
 | ||||
|     ~RoutePlugin() { | ||||
|         delete names; | ||||
|         delete sEngine; | ||||
|         delete graph; | ||||
|         delete nodeHelpDesk; | ||||
|     } | ||||
| 
 | ||||
|     std::string GetDescriptor() { return pluginDescriptorString; } | ||||
|  | ||||
							
								
								
									
										96
									
								
								routed.cpp
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								routed.cpp
									
									
									
									
									
								
							| @ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License | ||||
| along with this program; if not, write to the Free Software | ||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| or see http://www.gnu.org/licenses/agpl.txt.
 | ||||
| */ | ||||
|  */ | ||||
| 
 | ||||
| #include <iostream> | ||||
| 
 | ||||
| @ -30,6 +30,8 @@ or see http://www.gnu.org/licenses/agpl.txt. | ||||
| #include "Server/ServerConfiguration.h" | ||||
| #include "Server/ServerFactory.h" | ||||
| 
 | ||||
| #include "Plugins/ObjectForPluginStruct.h" | ||||
| 
 | ||||
| #include "Plugins/HelloWorldPlugin.h" | ||||
| #include "Plugins/LocatePlugin.h" | ||||
| #include "Plugins/NearestPlugin.h" | ||||
| @ -42,63 +44,59 @@ typedef http::RequestHandler RequestHandler; | ||||
| 
 | ||||
| int main (int argc, char *argv[]) | ||||
| { | ||||
| 	if(testDataFiles(argc, argv)==false) { | ||||
| 		std::cerr << "[error] at least one data file name seems to be bogus!" << std::endl; | ||||
| 		exit(-1); | ||||
| 	} | ||||
|     if(testDataFiles(argc, argv)==false) { | ||||
|         std::cerr << "[error] at least one data file name seems to be bogus!" << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
| 	try { | ||||
| 		std::cout << "[server] starting up engines, compiled at " << __TIMESTAMP__ << std::endl; | ||||
| 		int sig = 0; | ||||
| 		sigset_t new_mask; | ||||
| 		sigset_t old_mask; | ||||
| 		sigfillset(&new_mask); | ||||
| 		pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask); | ||||
|     try { | ||||
|         std::cout << "[server] starting up engines, compiled at " << __TIMESTAMP__ << std::endl; | ||||
|         int sig = 0; | ||||
|         sigset_t new_mask; | ||||
|         sigset_t old_mask; | ||||
|         sigfillset(&new_mask); | ||||
|         pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask); | ||||
| 
 | ||||
| 		ServerConfiguration serverConfig("server.ini"); | ||||
| 		Server * s = ServerFactory::CreateServer(serverConfig); | ||||
| 		RequestHandler & h = s->GetRequestHandlerPtr(); | ||||
|         ServerConfiguration serverConfig("server.ini"); | ||||
|         Server * s = ServerFactory::CreateServer(serverConfig); | ||||
|         RequestHandler & h = s->GetRequestHandlerPtr(); | ||||
| 
 | ||||
| 		BasePlugin * helloWorld = new HelloWorldPlugin(); | ||||
| 		h.RegisterPlugin(helloWorld); | ||||
| 
 | ||||
|         BasePlugin * locate = new LocatePlugin( | ||||
|         ObjectsForQueryStruct * objects = new ObjectsForQueryStruct(serverConfig.GetParameter("hsgrData"), | ||||
|                 serverConfig.GetParameter("ramIndex"), | ||||
|                 serverConfig.GetParameter("fileIndex"), | ||||
|                 serverConfig.GetParameter("nodesData")); | ||||
|                 serverConfig.GetParameter("nodesData"), | ||||
|                 serverConfig.GetParameter("namesData")); | ||||
| 
 | ||||
|         BasePlugin * helloWorld = new HelloWorldPlugin(); | ||||
|         h.RegisterPlugin(helloWorld); | ||||
| 
 | ||||
|         BasePlugin * locate = new LocatePlugin(objects); | ||||
|         h.RegisterPlugin(locate); | ||||
| 
 | ||||
|         BasePlugin * nearest = new NearestPlugin( | ||||
|                 serverConfig.GetParameter("ramIndex"), | ||||
|                 serverConfig.GetParameter("fileIndex"), | ||||
|                 serverConfig.GetParameter("nodesData")); | ||||
|         BasePlugin * nearest = new NearestPlugin(objects); | ||||
|         h.RegisterPlugin(nearest); | ||||
| 
 | ||||
| 		BasePlugin * route = new RoutePlugin( | ||||
| 				serverConfig.GetParameter("hsgrData"), | ||||
| 				serverConfig.GetParameter("ramIndex"), | ||||
| 				serverConfig.GetParameter("fileIndex"), | ||||
| 				serverConfig.GetParameter("nodesData"), | ||||
| 				serverConfig.GetParameter("namesData")); | ||||
| 		h.RegisterPlugin(route); | ||||
|         BasePlugin * route = new RoutePlugin(objects); | ||||
|         h.RegisterPlugin(route); | ||||
| 
 | ||||
| 		boost::thread t(boost::bind(&Server::Run, s)); | ||||
|         boost::thread t(boost::bind(&Server::Run, s)); | ||||
| 
 | ||||
| 		sigset_t wait_mask; | ||||
| 		pthread_sigmask(SIG_SETMASK, &old_mask, 0); | ||||
| 		sigemptyset(&wait_mask); | ||||
| 		sigaddset(&wait_mask, SIGINT); | ||||
| 		sigaddset(&wait_mask, SIGQUIT); | ||||
| 		sigaddset(&wait_mask, SIGTERM); | ||||
| 		pthread_sigmask(SIG_BLOCK, &wait_mask, 0); | ||||
| 		std::cout << "[server] running and waiting for requests" << std::endl; | ||||
| 		sigwait(&wait_mask, &sig); | ||||
| 		std::cout << std::endl << "[server] shutting down" << std::endl; | ||||
| 		s->Stop(); | ||||
| 		t.join(); | ||||
| 		delete s; | ||||
| 	} catch (std::exception& e) { | ||||
| 		std::cerr << "[fatal error] exception: " << e.what() << std::endl; | ||||
| 	} | ||||
| 	return 0; | ||||
|         sigset_t wait_mask; | ||||
|         pthread_sigmask(SIG_SETMASK, &old_mask, 0); | ||||
|         sigemptyset(&wait_mask); | ||||
|         sigaddset(&wait_mask, SIGINT); | ||||
|         sigaddset(&wait_mask, SIGQUIT); | ||||
|         sigaddset(&wait_mask, SIGTERM); | ||||
|         pthread_sigmask(SIG_BLOCK, &wait_mask, 0); | ||||
|         std::cout << "[server] running and waiting for requests" << std::endl; | ||||
|         sigwait(&wait_mask, &sig); | ||||
|         std::cout << std::endl << "[server] shutting down" << std::endl; | ||||
|         s->Stop(); | ||||
|         t.join(); | ||||
|         delete s; | ||||
|         delete objects; | ||||
|     } catch (std::exception& e) { | ||||
|         std::cerr << "[fatal error] exception: " << e.what() << std::endl; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user