Moving repeated hashmap construction to outer loop
This commit is contained in:
		
							parent
							
								
									30e76b4a32
								
							
						
					
					
						commit
						a0a0caad38
					
				@ -53,12 +53,12 @@ static const unsigned MAX_CACHE_ELEMENTS = 1000;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace NNGrid{
 | 
					namespace NNGrid{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct IdenticalHashFunction {
 | 
					//struct IdenticalHashFunction {
 | 
				
			||||||
public:
 | 
					//public:
 | 
				
			||||||
    inline unsigned operator ()(const unsigned value) const {
 | 
					//    inline unsigned operator ()(const unsigned value) const {
 | 
				
			||||||
        return value;
 | 
					//        return value;
 | 
				
			||||||
    }
 | 
					//    }
 | 
				
			||||||
};
 | 
					//};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static boost::thread_specific_ptr<std::ifstream> localStream;
 | 
					static boost::thread_specific_ptr<std::ifstream> localStream;
 | 
				
			||||||
@ -123,16 +123,16 @@ public:
 | 
				
			|||||||
        std::vector<GridEntry> entriesInFileWithRAMSameIndex;
 | 
					        std::vector<GridEntry> entriesInFileWithRAMSameIndex;
 | 
				
			||||||
        unsigned indexInRamTable = entries.begin()->ramIndex;
 | 
					        unsigned indexInRamTable = entries.begin()->ramIndex;
 | 
				
			||||||
        unsigned long lastPositionInIndexFile = 0;
 | 
					        unsigned long lastPositionInIndexFile = 0;
 | 
				
			||||||
        unsigned maxNumberOfRAMCellElements = 0;
 | 
					 | 
				
			||||||
        cout << "writing data ..." << flush;
 | 
					        cout << "writing data ..." << flush;
 | 
				
			||||||
        p.reinit(entries.size());
 | 
					        p.reinit(entries.size());
 | 
				
			||||||
 | 
					        boost::unordered_map< unsigned, unsigned > cellMap(1024);
 | 
				
			||||||
        BOOST_FOREACH(GridEntry & gridEntry, entries) {
 | 
					        BOOST_FOREACH(GridEntry & gridEntry, entries) {
 | 
				
			||||||
            p.printIncrement();
 | 
					            p.printIncrement();
 | 
				
			||||||
            if(gridEntry.ramIndex != indexInRamTable) {
 | 
					            if(gridEntry.ramIndex != indexInRamTable) {
 | 
				
			||||||
                unsigned numberOfBytesInCell = FillCell(entriesInFileWithRAMSameIndex, lastPositionInIndexFile);
 | 
					                cellMap.clear();
 | 
				
			||||||
                if(entriesInFileWithRAMSameIndex.size() > maxNumberOfRAMCellElements)
 | 
					                BuildCellIndexToFileIndexMap(indexInRamTable, cellMap);
 | 
				
			||||||
                    maxNumberOfRAMCellElements = entriesInFileWithRAMSameIndex.size();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                unsigned numberOfBytesInCell = FillCell(entriesInFileWithRAMSameIndex, lastPositionInIndexFile, cellMap);
 | 
				
			||||||
                ramIndexTable[indexInRamTable] = lastPositionInIndexFile;
 | 
					                ramIndexTable[indexInRamTable] = lastPositionInIndexFile;
 | 
				
			||||||
                lastPositionInIndexFile += numberOfBytesInCell;
 | 
					                lastPositionInIndexFile += numberOfBytesInCell;
 | 
				
			||||||
                entriesInFileWithRAMSameIndex.clear();
 | 
					                entriesInFileWithRAMSameIndex.clear();
 | 
				
			||||||
@ -140,7 +140,9 @@ public:
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            entriesInFileWithRAMSameIndex.push_back(gridEntry);
 | 
					            entriesInFileWithRAMSameIndex.push_back(gridEntry);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        /*unsigned numberOfBytesInCell = */FillCell(entriesInFileWithRAMSameIndex, lastPositionInIndexFile);
 | 
					        cellMap.clear();
 | 
				
			||||||
 | 
					         BuildCellIndexToFileIndexMap(indexInRamTable, cellMap);
 | 
				
			||||||
 | 
					        /*unsigned numberOfBytesInCell = */FillCell(entriesInFileWithRAMSameIndex, lastPositionInIndexFile, cellMap);
 | 
				
			||||||
        ramIndexTable[indexInRamTable] = lastPositionInIndexFile;
 | 
					        ramIndexTable[indexInRamTable] = lastPositionInIndexFile;
 | 
				
			||||||
        entriesInFileWithRAMSameIndex.clear();
 | 
					        entriesInFileWithRAMSameIndex.clear();
 | 
				
			||||||
        std::vector<GridEntry>().swap(entriesInFileWithRAMSameIndex);
 | 
					        std::vector<GridEntry>().swap(entriesInFileWithRAMSameIndex);
 | 
				
			||||||
@ -237,7 +239,7 @@ public:
 | 
				
			|||||||
        bool found = false;
 | 
					        bool found = false;
 | 
				
			||||||
        unsigned fileIndex = GetFileIndexForLatLon(100000*(lat2y(static_cast<double>(inputCoordinate.lat)/100000.)), inputCoordinate.lon);
 | 
					        unsigned fileIndex = GetFileIndexForLatLon(100000*(lat2y(static_cast<double>(inputCoordinate.lat)/100000.)), inputCoordinate.lon);
 | 
				
			||||||
        std::vector<_GridEdge> candidates;
 | 
					        std::vector<_GridEdge> candidates;
 | 
				
			||||||
        boost::unordered_map< unsigned, unsigned, IdenticalHashFunction > cellMap;
 | 
					        boost::unordered_map< unsigned, unsigned > cellMap;
 | 
				
			||||||
        for(int j = -32768; j < (32768+1); j+=32768) {
 | 
					        for(int j = -32768; j < (32768+1); j+=32768) {
 | 
				
			||||||
            for(int i = -1; i < 2; ++i) {
 | 
					            for(int i = -1; i < 2; ++i) {
 | 
				
			||||||
                GetContentsOfFileBucket(fileIndex+i+j, candidates, cellMap);
 | 
					                GetContentsOfFileBucket(fileIndex+i+j, candidates, cellMap);
 | 
				
			||||||
@ -263,7 +265,7 @@ public:
 | 
				
			|||||||
        unsigned fileIndex = GetFileIndexForLatLon(startCoord.lat, startCoord.lon);
 | 
					        unsigned fileIndex = GetFileIndexForLatLon(startCoord.lat, startCoord.lon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::vector<_GridEdge> candidates;
 | 
					        std::vector<_GridEdge> candidates;
 | 
				
			||||||
        boost::unordered_map< unsigned, unsigned, IdenticalHashFunction > cellMap;
 | 
					        boost::unordered_map< unsigned, unsigned > cellMap;
 | 
				
			||||||
        for(int j = -32768; j < (32768+1); j+=32768) {
 | 
					        for(int j = -32768; j < (32768+1); j+=32768) {
 | 
				
			||||||
            for(int i = -1; i < 2; ++i) {
 | 
					            for(int i = -1; i < 2; ++i) {
 | 
				
			||||||
                GetContentsOfFileBucket(fileIndex+i+j, candidates, cellMap);
 | 
					                GetContentsOfFileBucket(fileIndex+i+j, candidates, cellMap);
 | 
				
			||||||
@ -302,7 +304,7 @@ private:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inline void BuildCellIndexToFileIndexMap(const unsigned ramIndex, boost::unordered_map<unsigned, unsigned, IdenticalHashFunction >& cellMap){
 | 
					    inline void BuildCellIndexToFileIndexMap(const unsigned ramIndex, boost::unordered_map<unsigned, unsigned >& cellMap){
 | 
				
			||||||
        unsigned lineBase = ramIndex/1024;
 | 
					        unsigned lineBase = ramIndex/1024;
 | 
				
			||||||
        lineBase = lineBase*32*32768;
 | 
					        lineBase = lineBase*32*32768;
 | 
				
			||||||
        unsigned columnBase = ramIndex%1024;
 | 
					        unsigned columnBase = ramIndex%1024;
 | 
				
			||||||
@ -322,17 +324,13 @@ private:
 | 
				
			|||||||
        return (std::fabs(d1 - d2) < 0.0001);
 | 
					        return (std::fabs(d1 - d2) < 0.0001);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    unsigned FillCell(std::vector<GridEntry>& entriesWithSameRAMIndex, const unsigned long fileOffset ) {
 | 
					    unsigned FillCell(std::vector<GridEntry>& entriesWithSameRAMIndex, const unsigned long fileOffset, boost::unordered_map< unsigned, unsigned > & cellMap ) {
 | 
				
			||||||
    	std::vector<char> tmpBuffer(32*32*4096,0);
 | 
					        std::vector<char> tmpBuffer(32*32*4096,0);
 | 
				
			||||||
        unsigned long indexIntoTmpBuffer = 0;
 | 
					        unsigned long indexIntoTmpBuffer = 0;
 | 
				
			||||||
        unsigned numberOfWrittenBytes = 0;
 | 
					        unsigned numberOfWrittenBytes = 0;
 | 
				
			||||||
        assert(indexOutFile.is_open());
 | 
					        assert(indexOutFile.is_open());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::vector<unsigned long> cellIndex(32*32,ULONG_MAX);
 | 
					        std::vector<unsigned long> cellIndex(32*32,ULONG_MAX);
 | 
				
			||||||
        boost::unordered_map< unsigned, unsigned, IdenticalHashFunction > cellMap(1024);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        unsigned ramIndex = entriesWithSameRAMIndex.begin()->ramIndex;
 | 
					 | 
				
			||||||
        BuildCellIndexToFileIndexMap(ramIndex, cellMap);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for(unsigned i = 0; i < entriesWithSameRAMIndex.size() -1; ++i) {
 | 
					        for(unsigned i = 0; i < entriesWithSameRAMIndex.size() -1; ++i) {
 | 
				
			||||||
            assert(entriesWithSameRAMIndex[i].ramIndex== entriesWithSameRAMIndex[i+1].ramIndex);
 | 
					            assert(entriesWithSameRAMIndex[i].ramIndex== entriesWithSameRAMIndex[i+1].ramIndex);
 | 
				
			||||||
@ -405,7 +403,7 @@ private:
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        //Freeing data
 | 
					        //Freeing data
 | 
				
			||||||
        std::vector<GridEntry>().swap(vectorWithSameFileIndex);
 | 
					        vectorWithSameFileIndex.clear();
 | 
				
			||||||
        return counter;
 | 
					        return counter;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -444,7 +442,7 @@ private:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inline void GetContentsOfFileBucket(const unsigned fileIndex, std::vector<_GridEdge>& result, boost::unordered_map< unsigned, unsigned, IdenticalHashFunction > & cellMap) {
 | 
					    inline void GetContentsOfFileBucket(const unsigned fileIndex, std::vector<_GridEdge>& result, boost::unordered_map< unsigned, unsigned> & cellMap) {
 | 
				
			||||||
        unsigned ramIndex = GetRAMIndexFromFileIndex(fileIndex);
 | 
					        unsigned ramIndex = GetRAMIndexFromFileIndex(fileIndex);
 | 
				
			||||||
        unsigned long startIndexInFile = ramIndexTable[ramIndex];
 | 
					        unsigned long startIndexInFile = ramIndexTable[ramIndex];
 | 
				
			||||||
        if(startIndexInFile == ULONG_MAX) {
 | 
					        if(startIndexInFile == ULONG_MAX) {
 | 
				
			||||||
@ -528,7 +526,7 @@ private:
 | 
				
			|||||||
        return (p-x)*(p-x) + (q-y)*(q-y);
 | 
					        return (p-x)*(p-x) + (q-y)*(q-y);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void GetListOfIndexesForEdgeAndGridSize(const _Coordinate& start, const _Coordinate& target, std::vector<BresenhamPixel> &indexList) {
 | 
					    void GetListOfIndexesForEdgeAndGridSize(const _Coordinate& start, const _Coordinate& target, std::vector<BresenhamPixel> &indexList) const {
 | 
				
			||||||
        double lat1 = start.lat/100000.;
 | 
					        double lat1 = start.lat/100000.;
 | 
				
			||||||
        double lon1 = start.lon/100000.;
 | 
					        double lon1 = start.lon/100000.;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user