Speed up resource loading

This commit is contained in:
Victor Shcherb 2012-08-25 20:39:45 +02:00
parent a334193b14
commit b112a8a6d3
13 changed files with 6257 additions and 70 deletions

View file

@ -46,7 +46,7 @@ public class JUnitRouteTest {
int it = 0; int it = 0;
for (File f : files) { for (File f : files) {
RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$ RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$
rs[it++] = new BinaryMapIndexReader(raf, false); rs[it++] = new BinaryMapIndexReader(raf);
} }
} }

View file

@ -96,7 +96,7 @@ public class RouterTestsSuite {
int it = 0; int it = 0;
for (File f : files) { for (File f : files) {
RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$ RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$
rs[it++] = new BinaryMapIndexReader(raf, false); rs[it++] = new BinaryMapIndexReader(raf);
} }
boolean allSuccess = true; boolean allSuccess = true;

View file

@ -46,6 +46,18 @@ public class BinaryMapAddressReaderAdapter {
List<CitiesBlock> cities = new ArrayList<BinaryMapAddressReaderAdapter.CitiesBlock>(); List<CitiesBlock> cities = new ArrayList<BinaryMapAddressReaderAdapter.CitiesBlock>();
LatLon calculatedCenter = null; LatLon calculatedCenter = null;
public String getEnName() {
return enName;
}
public List<CitiesBlock> getCities() {
return cities;
}
public int getIndexNameOffset() {
return indexNameOffset;
}
} }
public static class CitiesBlock extends BinaryIndexPart { public static class CitiesBlock extends BinaryIndexPart {

View file

@ -58,16 +58,16 @@ public class BinaryMapIndexReader {
private final static Log log = LogUtil.getLog(BinaryMapIndexReader.class); private final static Log log = LogUtil.getLog(BinaryMapIndexReader.class);
private final RandomAccessFile raf; private final RandomAccessFile raf;
private int version; /*private*/ int version;
private long dateCreated; /*private */long dateCreated;
// keep them immutable inside // keep them immutable inside
private boolean basemap = false; /*private */ boolean basemap = false;
private List<MapIndex> mapIndexes = new ArrayList<MapIndex>(); /*private */List<MapIndex> mapIndexes = new ArrayList<MapIndex>();
private List<PoiRegion> poiIndexes = new ArrayList<PoiRegion>(); /*private */List<PoiRegion> poiIndexes = new ArrayList<PoiRegion>();
private List<AddressRegion> addressIndexes = new ArrayList<AddressRegion>(); /*private */List<AddressRegion> addressIndexes = new ArrayList<AddressRegion>();
private List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>(); /*private */List<TransportIndex> transportIndexes = new ArrayList<TransportIndex>();
private List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>(); /*private */List<RouteRegion> routingIndexes = new ArrayList<RouteRegion>();
private List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>(); /*private */List<BinaryIndexPart> indexes = new ArrayList<BinaryIndexPart>();
protected CodedInputStreamRAF codedIS; protected CodedInputStreamRAF codedIS;
@ -80,7 +80,27 @@ public class BinaryMapIndexReader {
public BinaryMapIndexReader(final RandomAccessFile raf) throws IOException { public BinaryMapIndexReader(final RandomAccessFile raf) throws IOException {
this(raf, false); this.raf = raf;
codedIS = CodedInputStreamRAF.newInstance(raf, 1024 * 5);
codedIS.setSizeLimit(Integer.MAX_VALUE); // 2048 MB
transportAdapter = new BinaryMapTransportReaderAdapter(this);
addressAdapter = new BinaryMapAddressReaderAdapter(this);
poiAdapter = new BinaryMapPoiReaderAdapter(this);
routeAdapter = new BinaryMapRouteReaderAdapter(this);
init();
}
/*private */BinaryMapIndexReader(final RandomAccessFile raf, boolean init) throws IOException {
this.raf = raf;
codedIS = CodedInputStreamRAF.newInstance(raf, 1024 * 5);
codedIS.setSizeLimit(Integer.MAX_VALUE); // 2048 MB
transportAdapter = new BinaryMapTransportReaderAdapter(this);
addressAdapter = new BinaryMapAddressReaderAdapter(this);
poiAdapter = new BinaryMapPoiReaderAdapter(this);
routeAdapter = new BinaryMapRouteReaderAdapter(this);
if(init) {
init();
}
} }
public BinaryMapIndexReader(final RandomAccessFile raf, BinaryMapIndexReader referenceToSameFile) throws IOException { public BinaryMapIndexReader(final RandomAccessFile raf, BinaryMapIndexReader referenceToSameFile) throws IOException {
@ -101,23 +121,6 @@ public class BinaryMapIndexReader {
basemap = referenceToSameFile.basemap; basemap = referenceToSameFile.basemap;
} }
public BinaryMapIndexReader(final RandomAccessFile raf, boolean readOnlyMapData) throws IOException {
this.raf = raf;
codedIS = CodedInputStreamRAF.newInstance(raf, 1024 * 5);
codedIS.setSizeLimit(Integer.MAX_VALUE); // 2048 MB
if(!readOnlyMapData){
transportAdapter = new BinaryMapTransportReaderAdapter(this);
addressAdapter = new BinaryMapAddressReaderAdapter(this);
poiAdapter = new BinaryMapPoiReaderAdapter(this);
routeAdapter = new BinaryMapRouteReaderAdapter(this);
} else {
transportAdapter = null;
addressAdapter = null;
poiAdapter = null;
routeAdapter = null;
}
init();
}
public long getDateCreated() { public long getDateCreated() {
return dateCreated; return dateCreated;
@ -420,6 +423,10 @@ public class BinaryMapIndexReader {
return getTransportIndex(s.getFileOffset()) != null; return getTransportIndex(s.getFileOffset()) != null;
} }
public List<TransportIndex> getTransportIndexes() {
return transportIndexes;
}
private TransportIndex getTransportIndex(int filePointer) { private TransportIndex getTransportIndex(int filePointer) {
TransportIndex ind = null; TransportIndex ind = null;
for(TransportIndex i : transportIndexes){ for(TransportIndex i : transportIndexes){

View file

@ -0,0 +1,309 @@
package net.osmand.binary;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.apache.commons.logging.Log;
import net.osmand.LogUtil;
import net.osmand.binary.BinaryMapAddressReaderAdapter.AddressRegion;
import net.osmand.binary.BinaryMapAddressReaderAdapter.CitiesBlock;
import net.osmand.binary.BinaryMapIndexReader.MapIndex;
import net.osmand.binary.BinaryMapIndexReader.MapRoot;
import net.osmand.binary.BinaryMapPoiReaderAdapter.PoiRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteRegion;
import net.osmand.binary.BinaryMapRouteReaderAdapter.RouteSubregion;
import net.osmand.binary.BinaryMapTransportReaderAdapter.IndexStringTable;
import net.osmand.binary.BinaryMapTransportReaderAdapter.TransportIndex;
import net.osmand.binary.OsmandIndex.AddressPart;
import net.osmand.binary.OsmandIndex.CityBlock;
import net.osmand.binary.OsmandIndex.FileIndex;
import net.osmand.binary.OsmandIndex.MapLevel;
import net.osmand.binary.OsmandIndex.MapPart;
import net.osmand.binary.OsmandIndex.OsmAndStoredIndex;
import net.osmand.binary.OsmandIndex.PoiPart;
import net.osmand.binary.OsmandIndex.RoutingPart;
import net.osmand.binary.OsmandIndex.RoutingSubregion;
import net.osmand.binary.OsmandIndex.TransportPart;
import net.osmand.osm.MapUtils;
public class CachedOsmandIndexes {
private OsmAndStoredIndex storedIndex;
private OsmAndStoredIndex.Builder storedIndexBuilder;
private Log log = LogUtil.getLog(CachedOsmandIndexes.class);
private boolean hasChanged = true;
public static final int VERSION = 1;
public void addToCache(BinaryMapIndexReader reader, File f) {
hasChanged = true;
if(storedIndexBuilder == null) {
storedIndexBuilder = OsmandIndex.OsmAndStoredIndex.newBuilder();
storedIndexBuilder.setVersion(VERSION);
storedIndexBuilder.setDateCreated(System.currentTimeMillis());
}
FileIndex.Builder fileIndex = OsmandIndex.FileIndex.newBuilder();
fileIndex.setDateModified(f.lastModified());
fileIndex.setSize(f.length());
fileIndex.setVersion(reader.getVersion());
fileIndex.setFileName(f.getName());
for(MapIndex index : reader.getMapIndexes()) {
MapPart.Builder map = OsmandIndex.MapPart.newBuilder();
map.setSize(index.getLength());
map.setOffset(index.getFilePointer());
if(index.getName() != null) {
map.setName(index.getName());
}
for(MapRoot mr : index.getRoots() ) {
MapLevel.Builder lev = OsmandIndex.MapLevel.newBuilder();
lev.setSize(mr.length);
lev.setOffset(mr.filePointer);
lev.setLeft(mr.left);
lev.setRight(mr.right);
lev.setTop(mr.top);
lev.setBottom(mr.bottom);
lev.setMinzoom(mr.minZoom);
lev.setMaxzoom(mr.maxZoom);
map.addLevels(lev);
}
fileIndex.addMapIndex(map);
}
for(AddressRegion index : reader.getAddressIndexes()) {
AddressPart.Builder addr = OsmandIndex.AddressPart.newBuilder();
addr.setSize(index.getLength());
addr.setOffset(index.getFilePointer());
if(index.getName() != null) {
addr.setName(index.getName());
}
if(index.getEnName() != null) {
addr.setNameEn(index.getEnName());
}
addr.setIndexNameOffset(index.getIndexNameOffset());
for(CitiesBlock mr : index.getCities() ) {
CityBlock.Builder cblock = OsmandIndex.CityBlock.newBuilder();
cblock.setSize(mr.length);
cblock.setOffset(mr.filePointer);
cblock.setType(mr.type);
addr.addCities(cblock);
}
fileIndex.addAddressIndex(addr);
}
for(PoiRegion index : reader.getPoiIndexes()) {
PoiPart.Builder poi = OsmandIndex.PoiPart.newBuilder();
poi.setSize(index.getLength());
poi.setOffset(index.getFilePointer());
if(index.getName() != null) {
poi.setName(index.getName());
}
poi.setLeft(MapUtils.get31TileNumberX(index.getLeftLongitude()));
poi.setRight(MapUtils.get31TileNumberX(index.getRightLongitude()));
poi.setTop(MapUtils.get31TileNumberY(index.getTopLatitude()));
poi.setBottom(MapUtils.get31TileNumberY(index.getBottomLatitude()));
fileIndex.addPoiIndex(poi.build());
}
for(TransportIndex index : reader.getTransportIndexes()) {
TransportPart.Builder transport = OsmandIndex.TransportPart.newBuilder();
transport.setSize(index.getLength());
transport.setOffset(index.getFilePointer());
if(index.getName() != null) {
transport.setName(index.getName());
}
transport.setLeft(index.getLeft());
transport.setRight(index.getRight());
transport.setTop(index.getTop());
transport.setBottom(index.getBottom());
transport.setStopsTableLength(index.stopsFileLength);
transport.setStopsTableOffset(index.stopsFileOffset);
transport.setStringTableLength(index.stringTable.length);
transport.setStringTableOffset(index.stringTable.fileOffset);
fileIndex.addTransportIndex(transport);
}
for(RouteRegion index : reader.getRoutingIndexes()) {
RoutingPart.Builder routing = OsmandIndex.RoutingPart.newBuilder();
routing.setSize(index.getLength());
routing.setOffset(index.getFilePointer());
if(index.getName() != null) {
routing.setName(index.getName());
}
for(RouteSubregion sub : index.getSubregions()) {
OsmandIndex.RoutingSubregion.Builder rpart = OsmandIndex.RoutingSubregion.newBuilder();
rpart.setSize(sub.length);
rpart.setOffset(sub.filePointer);
rpart.setLeft(sub.left);
rpart.setRight(sub.right);
rpart.setTop(sub.top);
rpart.setBottom(sub.bottom);
rpart.setShifToData(sub.shiftToData);
routing.addSubregions(rpart);
}
fileIndex.addRoutingIndex(routing);
}
storedIndexBuilder.addFileIndex(fileIndex);
}
public BinaryMapIndexReader getReader(File f) throws IOException {
RandomAccessFile mf = new RandomAccessFile(f, "r");
FileIndex found = null;
if (storedIndex != null) {
for (int i = 0; i < storedIndex.getFileIndexCount(); i++) {
FileIndex fi = storedIndex.getFileIndex(i);
if (f.length() == fi.getSize() && f.getName().equals(fi.getFileName())) {
// f.lastModified() == fi.getDateModified()
found = fi;
break;
}
}
}
BinaryMapIndexReader reader = null;
if (found == null) {
long val = System.currentTimeMillis();
reader = new BinaryMapIndexReader(mf);
addToCache(reader, f);
if (log.isDebugEnabled()) {
log.debug("Initializing db " + f.getAbsolutePath() + " " + (System.currentTimeMillis() - val ) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
} else {
reader = initFileIndex(found, mf);
}
return reader;
}
private BinaryMapIndexReader initFileIndex(FileIndex found, RandomAccessFile mf) throws IOException {
BinaryMapIndexReader reader = new BinaryMapIndexReader(mf, false);
reader.version = found.getVersion();
reader.dateCreated =found.getDateModified();
for(MapPart index : found.getMapIndexList()) {
MapIndex mi = new MapIndex();
mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset();
mi.name = index.getName();
for(MapLevel mr : index.getLevelsList()) {
MapRoot root = new MapRoot();
root.length = (int) mr.getSize();
root.filePointer = (int) mr.getOffset();
root.left = mr.getLeft();
root.right = mr.getRight();
root.top = mr.getTop();
root.bottom = mr.getBottom();
root.minZoom = mr.getMinzoom();
root.maxZoom = mr.getMaxzoom();
mi.roots.add(root);
}
reader.mapIndexes.add(mi);
reader.indexes.add(mi);
reader.basemap = reader.basemap || mi.isBaseMap();
}
for(AddressPart index : found.getAddressIndexList()) {
AddressRegion mi = new AddressRegion();
mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset();
mi.name = index.getName();
mi.enName = index.getNameEn();
mi.indexNameOffset = index.getIndexNameOffset();
for(CityBlock mr : index.getCitiesList() ) {
CitiesBlock cblock = new CitiesBlock();
cblock.length = (int) mr.getSize();
cblock.filePointer = (int) mr.getOffset();
cblock.type = mr.getType();
mi.cities.add(cblock);
}
reader.addressIndexes.add(mi);
reader.indexes.add(mi);
}
for(PoiPart index : found.getPoiIndexList()) {
PoiRegion mi = new PoiRegion();
mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset();
mi.name = index.getName();
mi.leftLongitude = MapUtils.get31LongitudeX(index.getLeft());
mi.rightLongitude = MapUtils.get31LongitudeX(index.getRight());
mi.topLatitude =MapUtils.get31LatitudeY(index.getTop());
mi.bottomLatitude = MapUtils.get31LatitudeY(index.getBottom());
reader.poiIndexes.add(mi);
reader.indexes.add(mi);
}
for(TransportPart index : found.getTransportIndexList()) {
TransportIndex mi = new TransportIndex();
mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset();
mi.name = index.getName();
mi.left = index.getLeft();
mi.right =index.getRight();
mi.top = index.getTop();
mi.bottom = index.getBottom();
mi.stopsFileLength = index.getStopsTableLength();
mi.stopsFileOffset = index.getStopsTableOffset();
mi.stringTable = new IndexStringTable();
mi.stringTable.fileOffset = index.getStringTableOffset();
mi.stringTable.length = index.getStringTableLength();
reader.transportIndexes.add(mi);
reader.indexes.add(mi);
}
for(RoutingPart index : found.getRoutingIndexList()) {
RouteRegion mi = new RouteRegion();
mi.length = (int) index.getSize();
mi.filePointer = (int) index.getOffset();
mi.name = index.getName();
for(RoutingSubregion mr : index.getSubregionsList()) {
RouteSubregion sub = new RouteSubregion(mi);
sub.length = (int) mr.getSize();
sub.filePointer = (int) mr.getOffset();
sub.left = mr.getLeft();
sub.right = mr.getRight();
sub.top = mr.getTop();
sub.bottom = mr.getBottom();
sub.shiftToData = mr.getShifToData();
mi.subregions.add(sub);
}
reader.routingIndexes.add(mi);
reader.indexes.add(mi);
}
return reader;
}
public void readFromFile(File f, int version) throws IOException {
long time = System.currentTimeMillis();
FileInputStream is = new FileInputStream(f);
try {
storedIndex = OsmandIndex.OsmAndStoredIndex.newBuilder().mergeFrom(is).build();
hasChanged = false;
if(storedIndex.getVersion() != version){
storedIndex = null;
}
} finally {
is.close();
}
log.info("Initialize cache " + (System.currentTimeMillis() - time));
}
public void writeToFile(File f) throws IOException {
if (hasChanged) {
FileOutputStream outputStream = new FileOutputStream(f);
try {
storedIndexBuilder.build().writeTo(outputStream);
} finally {
outputStream.close();
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -110,7 +110,7 @@ public class MapClusterLayer implements MapPanelLayer {
for (File f : new File(DataExtractionSettings.getSettings().getBinaryFilesDir()).listFiles()) { for (File f : new File(DataExtractionSettings.getSettings().getBinaryFilesDir()).listFiles()) {
if (f.getName().endsWith(".obf")) { if (f.getName().endsWith(".obf")) {
RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$ RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$
rs.add(new BinaryMapIndexReader(raf, false)); rs.add(new BinaryMapIndexReader(raf));
} }
} }
BinaryRoutePlanner router = new BinaryRoutePlanner(NativeSwingRendering.getDefaultFromSettings(), BinaryRoutePlanner router = new BinaryRoutePlanner(NativeSwingRendering.getDefaultFromSettings(),

View file

@ -594,7 +594,7 @@ public class MapRouterLayer implements MapPanelLayer {
int it = 0; int it = 0;
for (File f : files) { for (File f : files) {
RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$ RandomAccessFile raf = new RandomAccessFile(f, "r"); //$NON-NLS-1$ //$NON-NLS-2$
rs[it++] = new BinaryMapIndexReader(raf, false); rs[it++] = new BinaryMapIndexReader(raf);
} }
String m = DataExtractionSettings.getSettings().getRouteMode(); String m = DataExtractionSettings.getSettings().getRouteMode();
String[] props = m.split("\\,"); String[] props = m.split("\\,");

View file

@ -0,0 +1,105 @@
// Highly coupled with protobuf 2.3.0
option java_package = "net.osmand.binary";
//protoc --java_out=DataExtractionOSM/src DataExtractionOSM/src/osmand_index.proto
// C++ # cd OsmAnd
// # protoc --proto_path=../DataExtractionOSM/src --cpp_out=jni/osmand/proto ../DataExtractionOSM/src/osmand_odb.proto
message OsmAndStoredIndex {
required uint32 version = 1;
// System.currentTimeMillis()
required int64 dateCreated = 18;
repeated FileIndex fileIndex = 7;
}
message FileIndex {
required int64 size = 1;
required int64 dateModified = 2;
required string fileName = 3;
required int32 version = 4;
repeated AddressPart addressIndex = 8;
repeated TransportPart transportIndex = 9;
repeated PoiPart poiIndex = 10;
repeated MapPart mapIndex = 11;
repeated RoutingPart routingIndex = 12;
}
message AddressPart {
required int64 size = 1;
required int64 offset = 2;
optional string name = 3;
optional string nameEn = 4;
optional int32 indexNameOffset = 5;
repeated CityBlock cities = 8;
}
message CityBlock {
required int64 size = 1;
required int64 offset = 2;
required int32 type = 3;
}
message PoiPart {
required int64 size = 1;
required int64 offset = 2;
optional string name = 3;
required int32 left = 4;
required int32 right = 5;
required int32 top = 6;
required int32 bottom = 7;
}
message MapLevel {
required int64 size = 1;
required int64 offset = 2;
required int32 left = 4;
required int32 right = 5;
required int32 top = 6;
required int32 bottom = 7;
optional int32 minzoom = 8;
optional int32 maxzoom = 9;
}
message MapPart {
required int64 size = 1;
required int64 offset = 2;
optional string name = 3;
repeated MapLevel levels = 5;
}
message RoutingSubregion {
required int64 size = 1;
required int64 offset = 2;
required int32 left = 4;
required int32 right = 5;
required int32 top = 6;
required int32 bottom = 7;
required uint32 shifToData = 8;
}
message RoutingPart {
required int64 size = 1;
required int64 offset = 2;
optional string name = 3;
repeated RoutingSubregion subregions =5;
}
message TransportPart {
required int64 size = 1;
required int64 offset = 2;
optional string name = 3;
optional int32 left = 4;
optional int32 right = 5;
optional int32 top = 6;
optional int32 bottom = 7;
optional uint32 stringTableOffset = 8;
optional uint32 stringTableLength = 9;
optional uint32 stopsTableOffset = 10;
optional uint32 stopsTableLength = 11;
}

View file

@ -89,6 +89,11 @@
<arguments> <arguments>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec> </buildSpec>
<natures> <natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature> <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
@ -97,6 +102,7 @@
<nature>org.eclipse.cdt.core.ccnature</nature> <nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
</natures> </natures>
<linkedResources> <linkedResources>
<link> <link>

View file

@ -24,6 +24,7 @@ import net.osmand.LogUtil;
import net.osmand.ResultMatcher; import net.osmand.ResultMatcher;
import net.osmand.Version; import net.osmand.Version;
import net.osmand.binary.BinaryMapIndexReader; import net.osmand.binary.BinaryMapIndexReader;
import net.osmand.binary.CachedOsmandIndexes;
import net.osmand.data.Amenity; import net.osmand.data.Amenity;
import net.osmand.data.AmenityType; import net.osmand.data.AmenityType;
import net.osmand.data.IndexConstants; import net.osmand.data.IndexConstants;
@ -69,6 +70,7 @@ public class ResourceManager {
public static final String VOICE_PATH = APP_DIR + IndexConstants.VOICE_INDEX_DIR; public static final String VOICE_PATH = APP_DIR + IndexConstants.VOICE_INDEX_DIR;
public static final String GPX_PATH = APP_DIR + "tracks"; public static final String GPX_PATH = APP_DIR + "tracks";
public static final String MAPS_PATH = APP_DIR; public static final String MAPS_PATH = APP_DIR;
public static final String INDEXES_CACHE = APP_DIR + "ind.cache";
public static final String BACKUP_PATH = APP_DIR + "backup/"; public static final String BACKUP_PATH = APP_DIR + "backup/";
public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$ public static final String TILES_PATH = APP_DIR+"tiles/"; //$NON-NLS-1$
public static final String TEMP_SOURCE_TO_LOAD = "temp"; //$NON-NLS-1$ public static final String TEMP_SOURCE_TO_LOAD = "temp"; //$NON-NLS-1$
@ -526,12 +528,34 @@ public class ResourceManager {
file.mkdirs(); file.mkdirs();
List<String> warnings = new ArrayList<String>(); List<String> warnings = new ArrayList<String>();
renderer.clearAllResources(); renderer.clearAllResources();
CachedOsmandIndexes cachedOsmandIndexes = new CachedOsmandIndexes();
File indCache = context.getSettings().extendOsmandPath(INDEXES_CACHE);
if(indCache.exists()) {
try {
cachedOsmandIndexes.readFromFile(indCache, CachedOsmandIndexes.VERSION);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
if (file.exists() && file.canRead()) { if (file.exists() && file.canRead()) {
long val = System.currentTimeMillis();
for (File f : file.listFiles()) { for (File f : file.listFiles()) {
if (f.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) { if (f.getName().endsWith(IndexConstants.BINARY_MAP_INDEX_EXT)) {
progress.startTask(context.getString(R.string.indexing_map) + " " + f.getName(), -1); //$NON-NLS-1$ progress.startTask(context.getString(R.string.indexing_map) + " " + f.getName(), -1); //$NON-NLS-1$
try { try {
BinaryMapIndexReader index = renderer.initializeNewResource(progress, f); BinaryMapIndexReader index = null;
try {
index = cachedOsmandIndexes.getReader(f);
if (index.getVersion() != IndexConstants.BINARY_MAP_VERSION) {
index = null;
}
if (index != null) {
renderer.initializeNewResource(progress, f, index);
}
} catch (IOException e) {
log.error(String.format("File %s could not be read", f.getName()), e);
}
if (index == null || (Version.isFreeVersion(context) && f.getName().contains("_wiki"))) { if (index == null || (Version.isFreeVersion(context) && f.getName().contains("_wiki"))) {
warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$ warnings.add(MessageFormat.format(context.getString(R.string.version_index_is_not_supported), f.getName())); //$NON-NLS-1$
} else { } else {
@ -584,6 +608,14 @@ public class ResourceManager {
warnings.add(MessageFormat.format(context.getString(R.string.old_map_index_is_not_supported), f.getName())); //$NON-NLS-1$ warnings.add(MessageFormat.format(context.getString(R.string.old_map_index_is_not_supported), f.getName())); //$NON-NLS-1$
} }
} }
log.debug("All map files initialized " + (System.currentTimeMillis() - val) + " ms");
}
if(!indCache.exists() || indCache.canWrite()){
try {
cachedOsmandIndexes.writeToFile(indCache);
} catch (Exception e) {
log.error("Index file could not be written", e);
}
} }
return warnings; return warnings;
} }

View file

@ -355,7 +355,7 @@ public class LocalIndexHelper {
private void updateObfFileInformation(LocalIndexInfo info, File mapFile) { private void updateObfFileInformation(LocalIndexInfo info, File mapFile) {
try { try {
RandomAccessFile mf = new RandomAccessFile(mapFile, "r"); RandomAccessFile mf = new RandomAccessFile(mapFile, "r");
BinaryMapIndexReader reader = new BinaryMapIndexReader(mf, false); BinaryMapIndexReader reader = new BinaryMapIndexReader(mf);
info.setNotSupported(reader.getVersion() != IndexConstants.BINARY_MAP_VERSION); info.setNotSupported(reader.getVersion() != IndexConstants.BINARY_MAP_VERSION);
List<BinaryIndexPart> indexes = reader.getIndexes(); List<BinaryIndexPart> indexes = reader.getIndexes();

View file

@ -104,58 +104,25 @@ public class MapRenderRepositories {
return context; return context;
} }
public BinaryMapIndexReader initializeNewResource(final IProgress progress, File file) { public void initializeNewResource(final IProgress progress, File file, BinaryMapIndexReader reader) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
if (files.containsKey(file.getAbsolutePath())) { if (files.containsKey(file.getAbsolutePath())) {
closeConnection(files.get(file.getAbsolutePath()), file.getAbsolutePath()); closeConnection(files.get(file.getAbsolutePath()), file.getAbsolutePath());
}
RandomAccessFile raf = null;
BinaryMapIndexReader reader = null;
try {
raf = new RandomAccessFile(file, "r"); //$NON-NLS-1$
reader = new BinaryMapIndexReader(raf);
if (reader.getVersion() != IndexConstants.BINARY_MAP_VERSION) {
return null;
}
files.put(file.getAbsolutePath(), reader);
} catch (IOException e) {
log.error("No connection or unsupported version", e); //$NON-NLS-1$
if (raf != null) {
try {
raf.close();
} catch (IOException e1) {
}
}
return null;
} catch (OutOfMemoryError oome) {
if (raf != null) {
try {
raf.close();
} catch (IOException e1) {
}
}
throw oome;
}
long val = System.currentTimeMillis();
if (log.isDebugEnabled()) {
log.debug("Initializing db " + file.getAbsolutePath() + " " + (val - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
files.put(file.getAbsolutePath(), reader);
NativeOsmandLibrary nativeLib = prefs.NATIVE_RENDERING.get() ? NativeOsmandLibrary.getLoadedLibrary() : null; NativeOsmandLibrary nativeLib = prefs.NATIVE_RENDERING.get() ? NativeOsmandLibrary.getLoadedLibrary() : null;
if (nativeLib != null) { if (nativeLib != null) {
start = val;
if (!nativeLib.initMapFile(file.getAbsolutePath())) { if (!nativeLib.initMapFile(file.getAbsolutePath())) {
log.debug("Initializing native db " + file.getAbsolutePath() + " failed!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ log.debug("Initializing native db " + file.getAbsolutePath() + " failed!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else { } else {
nativeFiles.add(file.getAbsolutePath()); nativeFiles.add(file.getAbsolutePath());
val = System.currentTimeMillis(); long val = System.currentTimeMillis();
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Initializing native db " + file.getAbsolutePath() + " " + (val - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ log.debug("Initializing native db " + file.getAbsolutePath() + " " + (val - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} }
} }
} }
return reader;
} }
public RotatedTileBox getBitmapLocation() { public RotatedTileBox getBitmapLocation() {