Carregar grande quantidade de registros

Olá galera

Preciso mostrar uma grande quantidade de registros, em torno de 15.000 registros, mas tarda uma eternidad

Eu estou trabalhando com NetBeans Mobility e Floggy

Fiz um projeto em CLDC, que recupera 1.000 registros usando Floggy e mostra num List, rodando em um Samsung Omnia tarda 11 segundos.

Ai eu pensei. será que tarda tanto porque trata-se de um CLDC? Vou fazer um teste criando um projeto CDC.

Num projeto CDC, usando a máquina virtual CreMe (que por sinal foi a única máquina que consegui fazer rodar no Omnia), usando também, Floggy recuperando os mesmos 1.000 registros num componente List tardou 30 segundos?..

Lendo no forum, em procura de alguma luz, li acerca de uma pessoa que criou tipo uma Tabela flexível que mostra os registros não usando List e qualquer outro componente própia da linguagem, senão que ele criou uma tabela usando canvas… pusha pensei, aqui esta minha solução, muitas vezes os componentes próipias da linguagem são lentas.
Então baixei o código dele e adaptei para usar no meu programa. mas não tive nenhum ganho na performace.

Galera alguma idéia?

Agradeço quaquer ajuda que possam me dar

Boa noite deacmp,

Como você está carregando os teus dados via Floggy?

Os artibutos da tua classe são implemetações de Persistable também? Em caso positivo você já pensou em usar o lazy load ? http://floggy.sourceforge.net/getting-started.html#Lazy_loading_a_tree_of_objects

Você precisa da referência de todos os objetos após a listagem? Em caso negativo utilize o seguinte método para carregar os objetos e evitar a instanciação de vários objetos: http://floggy.sourceforge.net/getting-started.html#Listing_all_objects_fast_version

Um abraço!

Thiago Moreira

Olá Thiago

Eu estou carregando os dados assim:

else if(c == listarCmd){
if(lista == null){
lista = new List(“Lista produtos cadastrados”, Choice.IMPLICIT);
lista.addCommand(voltarCmd);
lista.setCommandListener(this);
}
else
lista.deleteAll();

        lista.append("CÓDIGO \t DESCRIÇÃO \t PREÇO",null);
        lista.append("----------------------------------------", null);
        PersistableManager pm = PersistableManager.getInstance();

        try {
            ObjectSet produtosArm = pm.find(BdProdutos.class, null, null);
            for(int i = 0; i < produtosArm.size(); i++){
                BdProdutos p = (BdProdutos) produtosArm.get(i);
                lista.append(p.getCodpro() + "  " + p.getDespro() + "  " + p.getPreco(), null);
            }
        } catch (FloggyException e) {
            lista.append("Error carregando os dados", null);
        }
        pai.display.setCurrent(lista);

Pergunta
Para carregar com lazy load eu tenho que passar um ID… aquele ID será o ID do registro, tipo como o registro do RMS??

Obrigadão pelo ajuda

então mas não é muita coisa pra vc exibir num mobile??? Vc realmente precisa de tudo isso de uma vez?

Olá Tecnoage

A verdade eu estou fazendo uma pesquisa para desenvolver nosso programa de força de vendas, e desafortunamente temos clientes que trabalham até com 15.000 registros. A ideia é usar PDA não celular. Feito um teste com .NET carregou 15.000 registros em 3 segundos. acho um a excelente performance.
Mas vc sabe como é… quando uno entra no mundo do java só quer desenvolver em java, e já que existe o Java ME, então vamos desenvolver em java… mas se não conseguir melhorar a performance tocara ir para o lado escuro da força

[quote=deacmp]mas se não conseguir melhorar a performance tocara ir para o lado escuro da força
[/quote]

Agora sim, finalmente está no caminho certo.

Boa noite deacmp,

O teu código pode ser melhorado, usando as duas dicas que eu passei… aqui vai o código.

   boolean lazy = true;
   BdProdutos p = new BdProdutos();
   ObjectSet produtosArm = pm.find(BdProdutos.class, null, null, lazy);
   for(int i = 0; i < produtosArm.size(); i++){
      produtosArm.get(i, p);
      lista.append(p.getCodpro() + " " + p.getDespro() + " " + p.getPreco(), null);
   }

Como você só vai criar um lista com os dados dos produtos não há necessidade de criar um novo objeto para cada produto salvo no RMS. Com esse código somente uma instancia de BDProdutos será criado para carregar todos os 15.000 produtos. Você vai evitar a instanciação de 14.999 objetos… acho que vao melhorar a tua performance!
Também aidcionei a flag lazy à chamada do método find.

Espero que ajude! E se ajudar nos avise!

Thiago Moreira

Olá Thiago

Alterei o código conforme sugerido, porém não melhorou a performance

Alguma outra idéia??

Obrigadão por qualquier ajuda q possa me dar

Humm…

Você poderia identificar onde os tempos são maiores?? Quanto tempo leva o dispositivo para executar o find? E quanto tempo leva para executar o for?

Thgiago Moreira

Bom,antes de perder um amigo para o lado negro da força, eu tinha muito este problema,até que resolvi meter a mão no bolso e comprar uma licença do banco perstDb (http://www.mcobject.com/j2me_database/), cara, ele lista 5.000 registros em 3 segundos!!! e se você usar a versão JSR 75 ele fica um pouco mais lento mas pode ficar mais robusto e volátil, usava antes RMS mas ele é muito melhor … Haa, nada contra Floggy, se descobrisse o segredo deste perstDB juro que ajudaria a imlementyar no Floggy,rs.

estou com esse problema também. A navegação entre os registros está horrível, e tive que fazer uma “gambiarra” para o cliente ir trabalhando enquanto não resolvo este problema de maneira definitiva. Gostei do floggy, e é a persistência que estou utilizando, fica muito bem organizado o armazenamento dos dados.

Antes que me perguntem, a gambiarra que eu fiz é carregar na memória a persistência antes de utilizar. Mas só estou fazendo isso pq o número de registros ainda está pequeno, algo em torno de 500, mas numa quantidade maior de registros não posso fazer isso. O aparelho que estou utilizando é um HTC Touch e o tempo gasto para carregar estes registros é algo em torno de 1 minuto e meio.

Alguém mais já testou, já utilizou ou utiliza este PerstDb e pode falar alguma coisa a cerca dele?

A maioria das pessoas tenta colocar 1000 items num list ao invés de colocar somente o que é visivel.
A mesma técnica implementada no Windows para se “carregar” um Listview com 1.000.000 de linhas, pode usar com um list. É só aplicar o conceito de Virtual Listview.dica dada.

Galera em 2006, no meu projeto de TCC que era criar um mini googlemaps que hoje em dia é algo trivial mas na época era algo novo, depois de alguns meses que apresentei o trabalho a google lança a primeira versão da api, hehehe sorte minha que ainda não tinham lançado.

Neste projeto tive o mesmo problema abordado no forum em apresentar uma mapa com 1500000 pontos, isso mesmo 1 milhão e quinhentos mil pontos e consegui só utilizando RMS.

O aplicativo foi apresentado em um celular sony k800, que na época era o melhor que eu tinha acesso, hoje em dia qualquer aparelho novo é igual ou até melhor que ele.

Vou colocar aqui minhas experiencias com este projeto quem sabe pode ajuda-los, um grande erro de performace que tive foi utilizar String, como tava iniciando nem sabia responder a pergunta qual a diferença de String para StringBuffer? Então na minha primeira tentativa de teste, carroça era um foguete perto do que o sistema apresentou. Ficou muito lento, então mudei tudo para Stringbuffer.

Com isso melhorou bem a performace mas ainda apresentava lentidão, foi ai então que percebi que toda vez que ia buscar um ponto eu buscava no RMS, memoria fisica do aparelho isso o deixava lento.

A medida que tomei e que faço até hoje é, em todo o tempo de vida da aplicação apenas 2 momentos terá acesso os dados na memoria fisica (RMS), primeiro na inicialização do sistema onde vc vai jogar tudo para memoria, e depois na finalização do Sistema onde vc irá salvar as modificações nos dados caso exista.

Desta forma o aplicativo ganhou muita mas muita performane tornando-o mais utilizavel.

Sei que o Floggy é utilizado por varios e que torna mais facil o desenvolvimento, mas pense que é uma camada a mais para que a persistencia seja feita, neste caso onde a performance está sendo prejudicada eu retiraria o floggy e faria tudo via rms puro.

O Floggy é uma ideia que utilizamos em desenvolvimento Web ou SE, criando as classes colocando os atributos como representação das colunas igual o Hibernate, mas lembre-se que aqui não é WEB ou SE e sim JavaME, se vcs pegarem qualquer livro de JavaME a ideia principal é, conceito orientado a Objeto não é 100% praticavel aqui, se for possivel tu escrever tudo em uma classe unica faça! Quanto mais vcs criarem classes, utilizar bibliotecas de persistencia, quebrar o maximo possivel, vai ter um projeto bem mais organizado mas ai a perca de performace vai ser grande pois neste nosso mundo isso é muito visivel diferente dos servidores Web ou maquinas SE, não se esqueçam disso.

mas daqui que vc joga esses dados na memória demora um pouquinho 8)

a idéia é tirar esse tempo.

Eu tb estava trabalhando desta forma, e trabalhava bem. Carregava antes os dados na memória para poder dar condições para o usuário trabalhar com mais eficiência.

Mas foi aí que eu consegui bolar uma espécie de índice dos registros, a partir disso minha história mudou. Utilizando floggy, percorro o índice de mais de 2000 registros em 2 segundos (isso foi a quantidade máxima que eu testei). Todo esse tempo incluindo o preenchimento de um ChoiceGroup.