Json+performace

Pessoal estou com um probleminha para motar um json com 200000 registros da base de dados, gostaria de saber se existe alguma forma de gerar esse json mais rapido, abaixo segue meu código:


 PrintWriter out = null;
            System.out.println("Parâmetro: " + request.getParameter("method"));
            try {
                out = response.getWriter();
                List<Quadrante> quadrantes = new ArrayList<Quadrante>();
                System.out.println("Iniciando o loop para criar a lista com todos os quadrantes...");
                for (Quadrante quadrante : quadranteDao.getQuadrantes()) {
                    quadrantes.add(quadrante);
                }
                Long timeIni = System.currentTimeMillis();
                out.print(gson.toJson(quadrantes));
                Long timeFim = System.currentTimeMillis();
                Long saida = timeFim - timeIni;
                System.out.println("Tempo para gerar o json com: " + quadrantes.size() + " o tempo foi de " + saida + "s");
                out.flush();
            } catch (IOException ex) {
                System.out.println("Erro ao enviar a resposta para o android. Erro: " + ex);
            } finally {
                out.close();
            }

Com esses dados que o servidor envia crio uma malha no google maps, abaixo segue meu js:

function carregaQuadrantes() {
                $(function() {
                    $.ajax({
                        type: "GET",
                        url: "/maps/Quadrantes?method=findAll",
                        success: function(dados) {
                            $.each(dados, function(key, val) {
                                console.log(val.latitudeNe);
                                var SW = new google.maps.LatLng(val.latitudeSw, val.longitudeSw);
                                var NE = new google.maps.LatLng(val.latitudeNe, val.longitudeNe);
                                var rectangle = new google.maps.Rectangle();
                                var rectOptions = {
                                    strokeColor: "black",
                                    strokeOpacity: 0.5,
                                    strokeWeight: 0.2,
                                    fillOpacity: 0,
                                    map: map,
                                    bounds: new google.maps.LatLngBounds(NE, SW)
                                };
                                rectangle.setOptions(rectOptions);
                                rectArr.push(rectangle);
                                bindWindow(rectangle, rectArr.length);
                            });

                        }
                    });
                });

            }

O código js esta com um tempo consideravel, porem a geração do json esta demorando muito alguem tem alguma dica de como gerar o json de uma forma rápida?

só uma dúvida o seu método quadranteDao.getQuadrantes() já não te retorna uma lista com os Quadrante?
Porque você ta fazendo um for pra varrer esta lista e adicionar os elementos em outras lista List quadrantes = …?
Pra só depois passar ele no método gson.toJson por que você já não passa o quadranteDao.getQuadrantes() direto.

[quote=jweibe]
só uma dúvida o seu método quadranteDao.getQuadrantes() já não te retorna uma lista com os Quadrante?
Porque você ta fazendo um for pra varrer esta lista e adicionar os elementos em outras lista List quadrantes = …?
Pra só depois passar ele no método gson.toJson por que você já não passa o quadranteDao.getQuadrantes() direto.[/quote]

O problema não é esse. Transpor essa lista, apesar de não precisar, é rápido.
O grande gargalo é: vc está tentando serializar 200.000 objetos!!! isso é o problema.

Não tem como paginar isso aí? por exemplo, de 100 em 100?

[quote=ruivo][quote=jweibe]
só uma dúvida o seu método quadranteDao.getQuadrantes() já não te retorna uma lista com os Quadrante?
Porque você ta fazendo um for pra varrer esta lista e adicionar os elementos em outras lista List quadrantes = …?
Pra só depois passar ele no método gson.toJson por que você já não passa o quadranteDao.getQuadrantes() direto.[/quote]

O problema não é esse. Transpor essa lista, apesar de não precisar, é rápido.
O grande gargalo é: vc está tentando serializar 200.000 objetos!!! isso é o problema.

Não tem como paginar isso aí? por exemplo, de 100 em 100?[/quote]

Como não? Qual o intuito de se fazer isso? uma vez que o dao já retorna uma lista de Quadrante e o for
pra percorrer não tem nenhuma funcionalidade a mais do que inserir os registros em uma segunda lista.
Se meu dao já me retorna uma lista com 200.000 que por sinal já esta na memória e ainda criar uma nova lista pra inserir estes
registros ou seja terei dados desnecessários na memória. ruivo tem certeza que isso não pode ser um problema?

O que você chama de demorar muito?

Vi que colocou um código ali para medir o tempo, mas não nos falou quanto tempo tá levando.

É naquela parte que mediu que está a demora? Quanto tempo leva? Quanto tempo queria que levasse?

[quote=jweibe]

Como não? Qual o intuito de se fazer isso? uma vez que o dao já retorna uma lista de Quadrante e o for
pra percorrer não tem nenhuma funcionalidade a mais do que inserir os registros em uma segunda lista.
Se meu dao já me retorna uma lista com 200.000 que por sinal já esta na memória e ainda criar uma nova lista pra inserir estes
registros ou seja terei dados desnecessários na memória. ruivo tem certeza que isso não pode ser um problema?[/quote]

Amigo, a menos que o ArrayList dele não seja o padrão, copiar de uma lista pra outra tem tempo irrisório. Porque, ao contrário do que você possa estar pensando, o método add não cria novos objetos. Você só adiciona na segunda lista uma referência para os objetos já criados.

Vamos à conta:
Lista -> 1 Objeto
Quadrante -> 200.000
nova lista -> 1 Objeto

Total -> 200.002 objetos.

como vc simplesmente está pegando da primeira lista e passando pra segunda, sem mais nenhuma operação, o custo é praticamente zero.

quer um exemplo? rode esse programa aqui

public class TesteLista {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		List<ObjetoFat> lista = new ArrayList<ObjetoFat>();
		for (long i = 0; i < 1000000; i++) {
			lista.add(new ObjetoFat());
		}
		
		long start = System.currentTimeMillis();
		
		List<ObjetoFat> lista2 = new ArrayList<ObjetoFat>();
		for (ObjetoFat object : lista) {
			lista2.add(object);
		}
		
		long end = System.currentTimeMillis();
		
		System.out.println("tempo: " + (end- start));
	}

}

class ObjetoFat {
	int a;
	int b;
	int c;
	int d;
	
	public ObjetoFat() {
		this.a = 100;
		this.b = 200;
		this.c = 400;
		this.d = 800;
	}
}

No meu computador, copiar mostrou 39 MILISEGUNDOS. E são 1 milhão de objetos.

Baseando-se no código que ele deu, É 99,99% de certeza que o problema é a serialização de tantos objetos ao mesmo tempo em json.