Java + Geotools demorando no linux

3 respostas
vi-gb

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.

3 Respostas

daveiga

Na máquina Linux você usa o Oracle/Sun JDK ou o OpenJDK? Se for o OpenJDK, desinstale e instale o Oracle/Sun JDK.
Já observei dignificativa diferença de performance entre eles.

C

Realmente, o OpenJDK ainda não tem performace satisfatória…

vi-gb

Oi gente, obrigada pela respostas!

Eu estou usando o jdk da oracle mesmo.
Expliquei meu problema no forum do geotools e eles tambem não sabem oque pode ser, disseram pra eu testar um profiler, vou fazer isso.

Se descobrir algo eu posto.

Criado 18 de junho de 2012
Ultima resposta 19 de jun. de 2012
Respostas 3
Participantes 3