preprocessor speedup using more memory

This commit is contained in:
Arndt Brenschede 2019-09-24 08:32:18 +02:00
parent 76e4ef8cab
commit ba34488447
10 changed files with 236 additions and 69 deletions

View file

@ -13,7 +13,7 @@ public class NodeCutter extends MapCreatorBase
{
private int lonoffset;
private int latoffset;
public static void main(String[] args) throws Exception
{
System.out.println("*** NodeCutter: Cut big node-tiles into 5x5 tiles");
@ -25,9 +25,14 @@ public class NodeCutter extends MapCreatorBase
new NodeCutter().process( new File( args[0] ), new File( args[1] ) );
}
public void process( File nodeTilesIn, File nodeTilesOut ) throws Exception
public void init( File nodeTilesOut )
{
this.outTileDir = nodeTilesOut;
}
public void process( File nodeTilesIn, File nodeTilesOut ) throws Exception
{
init( nodeTilesOut );
new NodeIterator( this, true ).processDir( nodeTilesIn, ".tlf" );
}

View file

@ -33,12 +33,18 @@ public class NodeFilter extends MapCreatorBase
new NodeFilter().process( new File( args[0] ), new File( args[1] ), new File( args[2] ) );
}
public void init() throws Exception
{
nodebitmap = Boolean.getBoolean( "useDenseMaps" ) ? new DenseLongMap( 512 ) : new TinyDenseLongMap();
}
public void process( File nodeTilesIn, File wayFileIn, File nodeTilesOut ) throws Exception
{
init();
this.nodeTilesOut = nodeTilesOut;
// read the wayfile into a bitmap of used nodes
nodebitmap = Boolean.getBoolean( "useDenseMaps" ) ? new DenseLongMap( 512 ) : new TinyDenseLongMap();
new WayIterator( this, false ).processFile( wayFileIn );
// finally filter all node files
@ -59,7 +65,6 @@ public class NodeFilter extends MapCreatorBase
public void nodeFileStart( File nodefile ) throws Exception
{
String filename = nodefile.getName();
filename = filename.substring( 0, filename.length() - 3 ) + "tlf";
File outfile = new File( nodeTilesOut, filename );
nodesOutStream = new DiffCoderDataOutputStream( new BufferedOutputStream ( new FileOutputStream( outfile ) ) );
}
@ -67,13 +72,18 @@ public class NodeFilter extends MapCreatorBase
@Override
public void nextNode( NodeData n ) throws Exception
{
// check if node passes bitmap
if ( nodebitmap.getInt( n.nid ) == 0 ) // 0 -> bit set, -1 -> unset
if ( isRelevant( n ) )
{
n.writeTo( nodesOutStream );
}
}
public boolean isRelevant( NodeData n )
{
// check if node passes bitmap
return nodebitmap.getInt( n.nid ) == 0; // 0 -> bit set, -1 -> unset
}
@Override
public void nodeFileEnd( File nodeFile ) throws Exception
{

View file

@ -12,6 +12,7 @@ import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import btools.expressions.BExpressionContextNode;
import btools.expressions.BExpressionContextWay;
@ -29,6 +30,9 @@ public class OsmCutter extends MapCreatorBase
private DataOutputStream cyclewayDos;
private DataOutputStream restrictionsDos;
public WayCutter wayCutter;
public NodeFilter nodeFilter;
public static void main(String[] args) throws Exception
{
System.out.println("*** OsmCutter: cut an osm map in node-tiles + a way file");
@ -53,8 +57,8 @@ public class OsmCutter extends MapCreatorBase
private BExpressionContextWay _expctxWay;
private BExpressionContextNode _expctxNode;
private BExpressionContextWay _expctxWayStat;
private BExpressionContextNode _expctxNodeStat;
// private BExpressionContextWay _expctxWayStat;
// private BExpressionContextNode _expctxNodeStat;
public void process (File lookupFile, File outTileDir, File wayFile, File relFile, File resFile, File profileFile, File mapFile ) throws Exception
{
@ -71,13 +75,13 @@ public class OsmCutter extends MapCreatorBase
_expctxWay.parseFile( profileFile, "global" );
_expctxWayStat = new BExpressionContextWay( null );
_expctxNodeStat = new BExpressionContextNode( null );
// _expctxWayStat = new BExpressionContextWay( null );
// _expctxNodeStat = new BExpressionContextNode( null );
this.outTileDir = outTileDir;
if ( !outTileDir.isDirectory() ) throw new RuntimeException( "out tile directory " + outTileDir + " does not exist" );
wayDos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( wayFile ) ) );
wayDos = wayFile == null ? null : new DataOutputStream( new BufferedOutputStream( new FileOutputStream( wayFile ) ) );
cyclewayDos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( relFile ) ) );
restrictionsDos = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( resFile ) ) );
@ -90,7 +94,10 @@ public class OsmCutter extends MapCreatorBase
// close all files
closeTileOutStreams();
wayDos.close();
if ( wayDos != null )
{
wayDos.close();
}
cyclewayDos.close();
restrictionsDos.close();
@ -122,11 +129,10 @@ public class OsmCutter extends MapCreatorBase
if ( n.getTagsOrNull() != null )
{
int[] lookupData = _expctxNode.createNewLookupData();
for( String key : n.getTagsOrNull().keySet() )
for( Map.Entry<String,String> e : n.getTagsOrNull().entrySet() )
{
String value = n.getTag( key );
_expctxNode.addLookupValue( key, value, lookupData );
_expctxNodeStat.addLookupValue( key, value, null );
_expctxNode.addLookupValue( e.getKey(), e.getValue(), lookupData );
// _expctxNodeStat.addLookupValue( key, value, null );
}
n.description = _expctxNode.encode(lookupData);
}
@ -136,6 +142,10 @@ public class OsmCutter extends MapCreatorBase
{
n.writeTo( getOutStreamForTile( tileIndex ) );
}
if ( wayCutter != null )
{
wayCutter.nextNode( n );
}
}
@ -144,15 +154,17 @@ public class OsmCutter extends MapCreatorBase
// add pseudo.tags for concrete:lanes and concrete:plates
String concrete = null;
for( String key : map.keySet() )
for( Map.Entry<String,String> e : map.entrySet() )
{
String key = e.getKey();
if ( "concrete".equals( key ) )
{
return;
}
if ( "surface".equals( key ) )
{
String value = map.get( key );
String value = e.getValue();
if ( value.startsWith( "concrete:" ) )
{
concrete = value.substring( "concrete:".length() );
@ -182,7 +194,7 @@ public class OsmCutter extends MapCreatorBase
{
String value = w.getTag( key );
_expctxWay.addLookupValue( key, value.replace( ' ', '_' ), lookupData );
_expctxWayStat.addLookupValue( key, value, null );
// _expctxWayStat.addLookupValue( key, value, null );
}
w.description = _expctxWay.encode(lookupData);
@ -195,7 +207,18 @@ public class OsmCutter extends MapCreatorBase
ok |= _expctxWay.getCostfactor() < 10000.;
if ( !ok ) return;
w.writeTo( wayDos );
if ( wayDos != null )
{
w.writeTo( wayDos );
}
if ( wayCutter != null )
{
wayCutter.nextWay( w );
}
if ( nodeFilter != null )
{
nodeFilter.nextWay( w );
}
}
@Override
@ -300,6 +323,6 @@ public class OsmCutter extends MapCreatorBase
int lat = (tileIndex % 6 ) * 30 - 90;
String slon = lon < 0 ? "W" + (-lon) : "E" + lon;
String slat = lat < 0 ? "S" + (-lat) : "N" + lat;
return slon + "_" + slat + ".tls";
return slon + "_" + slat + ".ntl";
}
}

View file

@ -0,0 +1,76 @@
/**
* This program
* - reads an *.osm from stdin
* - writes 45*30 degree node tiles + a way file + a rel file
*
* @author ab
*/
package btools.mapcreator;
import java.io.File;
public class OsmFastCutter extends MapCreatorBase
{
public static void main(String[] args) throws Exception
{
System.out.println("*** OsmFastCutter: cut an osm map in node-tiles + way-tiles");
if (args.length != 11 && args.length != 12)
{
String common = "java OsmFastCutter <lookup-file> <node-dir> <way-dir> <node55-dir> <way55-dir> <border-file> <out-rel-file> <out-res-file> <filter-profile> <report-profile> <check-profile>";
System.out.println("usage: bzip2 -dc <map> | " + common );
System.out.println("or : " + common + " <inputfile> " );
return;
}
doCut(
new File( args[0] )
, new File( args[1] )
, new File( args[2] )
, new File( args[3] )
, new File( args[4] )
, new File( args[5] )
, new File( args[6] )
, new File( args[7] )
, new File( args[8] )
, new File( args[9] )
, new File( args[10] )
, args.length > 11 ? new File( args[11] ) : null
);
}
public static void doCut (File lookupFile, File nodeDir, File wayDir, File node55Dir, File way55Dir, File borderFile, File relFile, File resFile, File profileAll, File profileReport, File profileCheck, File mapFile ) throws Exception
{
// **** run OsmCutter ****
OsmCutter cutter = new OsmCutter();
// ... inject WayCutter
cutter.wayCutter = new WayCutter();
cutter.wayCutter.init( wayDir );
// ... inject NodeFilter
NodeFilter nodeFilter = new NodeFilter();
nodeFilter.init();
cutter.nodeFilter = nodeFilter;
cutter.process( lookupFile, nodeDir, null, relFile, resFile, profileAll, mapFile );
cutter.wayCutter.finish();
cutter = null;
// ***** run WayCutter5 ****
WayCutter5 wayCut5 = new WayCutter5();
//... inject RelationMerger
wayCut5.relMerger = new RelationMerger();
wayCut5.relMerger.init( relFile, lookupFile, profileReport, profileCheck );
//... inject NodeFilter
wayCut5.nodeFilter = nodeFilter;
// ... inject NodeCutter
wayCut5.nodeCutter = new NodeCutter();
wayCut5.nodeCutter.init( node55Dir );
wayCut5.process( nodeDir, wayDir, way55Dir, borderFile );
}
}

View file

@ -107,6 +107,21 @@ public class PosUnifier extends MapCreatorBase
}
private void findUniquePos( NodeData n )
{
int lon = n.ilon;
int lat = n.ilat;
long pid = ( (long) lon ) << 32 | lat; // id from position
if ( !positionSet.contains( pid ) )
{
positionSet.fastAdd( pid );
}
else
{
_findUniquePos( n );
}
}
private void _findUniquePos( NodeData n )
{
// fix the position for uniqueness
int lonmod = n.ilon % 1000000;

View file

@ -40,14 +40,14 @@ public class RelationMerger extends MapCreatorBase
new RelationMerger().process( new File( args[0] ), new File( args[1] ), new File( args[2] ), new File( args[3] ), new File( args[4] ), new File( args[5] ) );
}
public void process( File wayFileIn, File wayFileOut, File relationFileIn, File lookupFile, File reportProfile, File checkProfile ) throws Exception
public void init( File relationFileIn, File lookupFile, File reportProfile, File checkProfile ) throws Exception
{
// read lookup + profile for relation access-check
BExpressionMetaData metaReport = new BExpressionMetaData();
BExpressionMetaData metaReport = new BExpressionMetaData();
expctxReport = new BExpressionContextWay( metaReport );
metaReport.readMetaData( lookupFile );
BExpressionMetaData metaCheck = new BExpressionMetaData();
BExpressionMetaData metaCheck = new BExpressionMetaData();
expctxCheck = new BExpressionContextWay( metaCheck );
metaCheck.readMetaData( lookupFile );
@ -106,6 +106,11 @@ public class RelationMerger extends MapCreatorBase
routesets.put( key, routeset );
System.out.println( "marked " + routeset.size() + " routes for key: " + key );
}
}
public void process( File wayFileIn, File wayFileOut, File relationFileIn, File lookupFile, File reportProfile, File checkProfile ) throws Exception
{
init( relationFileIn, lookupFile, reportProfile, checkProfile );
// *** finally process the way-file
wayOutStream = createOutStream( wayFileOut );
@ -151,8 +156,10 @@ public class RelationMerger extends MapCreatorBase
data.description = expctxReport.encode();
}
}
data.writeTo( wayOutStream );
if ( wayOutStream != null )
{
data.writeTo( wayOutStream );
}
}
}

View file

@ -31,14 +31,25 @@ public class WayCutter extends MapCreatorBase
public void process( File nodeTilesIn, File wayFileIn, File wayTilesOut ) throws Exception
{
this.outTileDir = wayTilesOut;
init( wayTilesOut );
// *** read all nodes into tileIndexMap
tileIndexMap = Boolean.getBoolean( "useDenseMaps" ) ? new DenseLongMap() : new TinyDenseLongMap();
new NodeIterator( this, false ).processDir( nodeTilesIn, ".tlf" );
// *** finally process the way-file, cutting into pieces
new WayIterator( this, true ).processFile( wayFileIn );
finish();
}
public void init( File wayTilesOut ) throws Exception
{
this.outTileDir = wayTilesOut;
// *** read all nodes into tileIndexMap
tileIndexMap = Boolean.getBoolean( "useDenseMaps" ) ? new DenseLongMap() : new TinyDenseLongMap();
}
public void finish() throws Exception
{
closeTileOutStreams();
}

View file

@ -22,6 +22,10 @@ public class WayCutter5 extends MapCreatorBase
private int lonoffset;
private int latoffset;
public RelationMerger relMerger;
public NodeFilter nodeFilter;
public NodeCutter nodeCutter;
public static void main(String[] args) throws Exception
{
System.out.println("*** WayCutter5: Soft-Cut way-data into tiles");
@ -50,12 +54,17 @@ public class WayCutter5 extends MapCreatorBase
{
// read corresponding node-file into tileIndexMap
String name = wayfile.getName();
String nodefilename = name.substring( 0, name.length()-3 ) + "tlf";
String nodefilename = name.substring( 0, name.length()-3 ) + "ntl";
File nodefile = new File( nodeTilesIn, nodefilename );
tileIndexMap = Boolean.getBoolean( "useDenseMaps" ) ? new DenseLongMap() : new TinyDenseLongMap();
lonoffset = -1;
latoffset = -1;
if ( nodeCutter != null )
{
nodeCutter.nodeFileStart( null );
}
new NodeIterator( this, false ).processFile( nodefile );
return true;
}
@ -63,6 +72,18 @@ public class WayCutter5 extends MapCreatorBase
@Override
public void nextNode( NodeData n ) throws Exception
{
if ( nodeFilter != null )
{
if ( !nodeFilter.isRelevant( n ) )
{
return;
}
}
if ( nodeCutter != null )
{
nodeCutter.nextNode( n );
}
tileIndexMap.put( n.nid, getTileIndex( n.ilon, n.ilat ) );
}
@ -83,6 +104,11 @@ public class WayCutter5 extends MapCreatorBase
}
tiForNode[i] = tileIndex;
}
if ( relMerger != null )
{
relMerger.nextWay( data );
}
// now write way to all tiles hit
for( int tileIndex=0; tileIndex<54; tileIndex++ )
@ -112,6 +138,10 @@ public class WayCutter5 extends MapCreatorBase
public void wayFileEnd( File wayFile ) throws Exception
{
closeTileOutStreams();
if ( nodeCutter != null )
{
nodeCutter.nodeFileEnd( null );
}
}
private int getTileIndex( int ilon, int ilat )

View file

@ -64,6 +64,8 @@ public class WayLinker extends MapCreatorBase
private int divisor = 32;
private int cellsize = 1000000 / divisor;
private boolean skipEncodingCheck;
private void reset()
{
minLon = -1;
@ -110,6 +112,8 @@ public class WayLinker extends MapCreatorBase
abUnifier = new ByteArrayUnifier( 16384, false );
skipEncodingCheck = Boolean.getBoolean( "skipEncodingCheck" );
// then process all segments
new WayIterator( this, true ).processDir( wayTilesIn, ".wt5" );
}
@ -433,7 +437,11 @@ public class WayLinker extends MapCreatorBase
int len = mc.encodeMicroCache( abBuf1 );
subBytes = new byte[len];
System.arraycopy( abBuf1, 0, subBytes, 0, len );
if ( skipEncodingCheck )
{
break;
}
// cross-check the encoding: re-instantiate the cache
MicroCache mc2 = new MicroCache2( new StatCoderContext( subBytes ), new DataBuffers( null ), lonIdxDiv, latIdxDiv, divisor, null, null );
// ..and check if still the same

View file

@ -15,58 +15,40 @@ public class MapcreatorTest
{
URL mapurl = this.getClass().getResource( "/dreieich.osm.gz" );
Assert.assertTrue( "test-osm-map dreieich.osm not found", mapurl != null );
File mapfile = new File(mapurl.getFile());
File workingDir = mapfile.getParentFile();
File mapFile = new File(mapurl.getFile());
File workingDir = mapFile.getParentFile();
File profileDir = new File( workingDir, "/../../../misc/profiles2" );
File tmpdir = new File( workingDir, "tmp" );
tmpdir.mkdir();
// run OsmCutter
File nodetiles = new File( tmpdir, "nodetiles" );
nodetiles.mkdir();
File lookupFile = new File( profileDir, "lookups.dat" );
File wayFile = new File( tmpdir, "ways.dat" );
File relFile = new File( tmpdir, "cycleways.dat" );
File resFile = new File( tmpdir, "restrictions.dat" );
File profileAllFile = new File( profileDir, "all.brf" );
new OsmCutter().process( lookupFile, nodetiles, wayFile, relFile, resFile, profileAllFile, mapfile );
// run NodeFilter
File ftiles = new File( tmpdir, "ftiles" );
ftiles.mkdir();
new NodeFilter().process( nodetiles, wayFile, ftiles );
// run RelationMerger
File wayFile2 = new File( tmpdir, "ways2.dat" );
File profileReport = new File( profileDir, "trekking.brf" );
File profileCheck = new File( profileDir, "softaccess.brf" );
new RelationMerger().process( wayFile, wayFile2, relFile, lookupFile, profileReport, profileCheck );
// run WayCutter
File waytiles = new File( tmpdir, "waytiles" );
waytiles.mkdir();
new WayCutter().process( ftiles, wayFile2, waytiles );
// run WayCutter5
File waytiles55 = new File( tmpdir, "waytiles55" );
File bordernids = new File( tmpdir, "bordernids.dat" );
waytiles55.mkdir();
new WayCutter5().process( ftiles, waytiles, waytiles55, bordernids );
// run NodeCutter
File nodes = new File( tmpdir, "nodetiles" );
nodes.mkdir();
File ways = new File( tmpdir, "waytiles" );
ways.mkdir();
File nodes55 = new File( tmpdir, "nodes55" );
nodes55.mkdir();
new NodeCutter().process( ftiles, nodes55 );
File ways55 = new File( tmpdir, "waytiles55" );
ways55.mkdir();
File lookupFile = new File( profileDir, "lookups.dat" );
File relFile = new File( tmpdir, "cycleways.dat" );
File resFile = new File( tmpdir, "restrictions.dat" );
File profileAll = new File( profileDir, "all.brf" );
File profileReport = new File( profileDir, "trekking.brf" );
File profileCheck = new File( profileDir, "softaccess.brf" );
File borderFile = new File( tmpdir, "bordernids.dat" );
new OsmFastCutter().doCut( lookupFile, nodes, ways, nodes55, ways55, borderFile, relFile, resFile, profileAll, profileReport, profileCheck, mapFile );
// run PosUnifier
File unodes55 = new File( tmpdir, "unodes55" );
File bordernodes = new File( tmpdir, "bordernodes.dat" );
unodes55.mkdir();
new PosUnifier().process( nodes55, unodes55, bordernids, bordernodes, "/private-backup/srtm" );
new PosUnifier().process( nodes55, unodes55, borderFile, bordernodes, "/private-backup/srtm" );
// run WayLinker
File segments = new File( tmpdir, "segments" );
segments.mkdir();
new WayLinker().process( unodes55, waytiles55, bordernodes, resFile, lookupFile, profileAllFile, segments, "rd5" );
new WayLinker().process( unodes55, ways55, bordernodes, resFile, lookupFile, profileAll, segments, "rd5" );
}
}