Oi, tenho uma base com 4 tabelas, estas tabelas nao possuem muitas linhas (50 - 500) mas possuem poligonos grandes (paises, estados, lagos, rios) e executo uma mesma busca
em todas para formar uma imagem, em uma maquina com Windows funciona rapido principalmente quando não tem resultados mas quando executei o mesmo programa em uma maquina com Linux ficou bem lento mesmo quando não ha resultados a retornar.
So para ter uma ideia, enquanto uma maquina com Windows demorou 20 horas para gerar 660.000 imagens, uma maquina linux demorou 60 horas para fazer a mesma quantia.
Maquina Windows: Core 2 Duo, 4Gb, 500Gb
Maquina Linux: I7, 16Gb, 1Tb
O banco de dados em que ambas conectam fica em outra maquina linux.
Abaixo esta meu codigo e nos comentarios estao os pontos que demora e o tempo em milisegundos.
public List<Coordinate[]> readCoordinates(String name, ReferencedEnvelope area){
List<Coordinate[]> contornos = new ArrayList<Coordinate[]>();
SimpleFeatureIterator iterator = null;
try{
//it takes time but I think its normal (0 - 100 ms)
SimpleFeatureSource feature = getDataStore().getFeatureSource(name);
FeatureType schema = feature.getSchema();
String geometryPropertyName = schema.getGeometryDescriptor().getLocalName();
String[] campos = new String[]{geometryPropertyName};
Filter filter = geraFilterBox(area, geometryPropertyName);
Query query = new Query(name, filter);
query.setPropertyNames(campos);
SimpleFeatureCollection fc = feature.getFeatures(query);
//it takes 5 - 400 ms, even when wont return anything
iterator = fc.features();
while (iterator.hasNext()){
//do something but is fast
}
}catch(Exception ioEx){
ioEx.printStackTrace();
} finally {
if (iterator != null) {
//it takes 0 - 300 ms
iterator.close();
}
}
return contornos;
}
private Filter geraFilterBox(ReferencedEnvelope envelope, String geometryPropertyName) {
FilterFactory2 filterFactory2 = CommonFactoryFinder.getFilterFactory2(GeoTools.getDefaultHints());
Filter filter = filterFactory2.bbox(
filterFactory2.property( geometryPropertyName ), envelope );
Filter polygonCheck = filterFactory2.not( filterFactory2.disjoint(
filterFactory2.property(geometryPropertyName),
filterFactory2.literal( generatePolygon(envelope)) ));
filter = filterFactory2.and( filter, polygonCheck );
return filter;
}
private Polygon generatePolygon(ReferencedEnvelope envelope) {
double xMin = envelope.getMinX();
double yMin = envelope.getMinY();
double xMax = envelope.getMaxX();
double yMax = envelope.getMaxY();
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
Coordinate[] area = {new Coordinate(xMin, yMin),
new Coordinate(xMax, yMin),
new Coordinate(xMax, yMax),
new Coordinate(xMin, yMax),
new Coordinate(xMin, yMin)};
LinearRing geometry = geometryFactory.createLinearRing(area);
Polygon polygon = geometryFactory.createPolygon(geometry, null);
return polygon;
}
private DataStore getDataStore() {
if (dataStore == null) {
try {
HashMap<String, Object> params = new HashMap<String, Object>();
params.put(JDBCDataStoreFactory.DBTYPE.key, "postgis");
params.put(JDBCDataStoreFactory.HOST.key, "***.***.*.*");
params.put(JDBCDataStoreFactory.PORT.key, 5432);
params.put(JDBCDataStoreFactory.USER.key, "***");
params.put(JDBCDataStoreFactory.PASSWD.key, "******");
params.put(JDBCDataStoreFactory.DATABASE.key, "******");
params.put(JDBCDataStoreFactory.VALIDATECONN.key, Boolean.TRUE);
dataStore = DataStoreFinder.getDataStore( params );
} catch (IOException e) {
e.printStackTrace();
}
}
return dataStore;
}
Também estou postando em foruns do geotools mas postei aqui tbm pq sei que tem usuarios do GUJ q tbm usam o geotools.