Mais uma curiosidade do que dúvida. Performace

9 respostas
G

Me surgiu essa curiosidade agora.

No caso tenho duas funções, uma para ler um arquivo csv e outra para gravar os dados lidos no sqlite. Em questão de performace o que é melhor, ir gravando no banco conforme for lendo as linhas do csv ou ir populando um objeto com os dados lidos só depois chamar a função que grava no banco passando o objeto populado

E aproveitando, tem algum modo para verificar quanto que um processo está consumindo de memória e seu tempo de processamento?

9 Respostas

A

Olá
Uma boa opção é usar o padrão produtor-consumidor, uma thread lendo o arquivo csv e outra gravando o db.
para medir usa o seguinte:

long start = System.nanoTime(); ... processamento long stop = System.nanoTime(); double demorou = (double)(stop-start)/[telefone removido];

Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html

Espero que ajude.
Abraço

J

Já vi casos onde fazer operações em lote no banco de dados era mais rapido do que operações individuais…
Construi varias threads lendo arquivos e montando lotes…
E uma outra thread que processava um lote de cada vez de forma individual…

ideiainformatica

Onde este arquivo csv está localizado?
Como você faz para lê-lo?
Eu preciso ler um arquivo texto no meu site e ler seus registros, é assim que você precisa?

A

jmmenezes:
Já vi casos onde fazer operações em lote no banco de dados era mais rapido do que operações individuais…
Construi varias threads lendo arquivos e montando lotes…
E uma outra thread que processava um lote de cada vez de forma individual…

Se o arquivo for muito grande, realmente fica melhor gravar em lotes.
Usando o padrão produtor-consumidor, você envia os lotes de objetos, e no consumidor trata as inserções numa única transação.

E

O modo padrão de abertura de arquivos no SQLite é extremamente conservador e faz com que as gravações no banco sejam extremamente lentas (basicamente, ele abre o arquivo, grava um registro, faz um flush, então fecha o arquivo - imagine fazer isso dezenas de milhares de vezes)…
O correto é usar um “pragma”:

http://www.sqlite.org/pragma.html#pragma_synchronous

Usando PRAGMA synchronous=OFF você terá um carregamento muito veloz de seu arquivo CSV - não se esqueça de encerrar corretamente o SQLite antes de sair do programa, para não deixar o arquivo corrompido.

G

ideiainformatica:
Onde este arquivo csv está localizado?
Como você faz para lê-lo?
Eu preciso ler um arquivo texto no meu site e ler seus registros, é assim que você precisa?

é algo bem simples, é só alguns dados que vai gravar no banco quando instala o app. Estou pegando direto do diretório asset o csv e utilizando o opencsv para ler o arquivo

G

A H Gusukuma:
Olá
Uma boa opção é usar o padrão produtor-consumidor, uma thread lendo o arquivo csv e outra gravando o db.
para medir usa o seguinte:

long start = System.nanoTime(); ... processamento long stop = System.nanoTime(); double demorou = (double)(stop-start)/[telefone removido];

Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html

Espero que ajude.
Abraço

como funciona esse conceito de produto-consumidor? e como posso fazer para usar threads?

A

guilhermecoelho2:
A H Gusukuma:
Olá
Uma boa opção é usar o padrão produtor-consumidor, uma thread lendo o arquivo csv e outra gravando o db.
para medir usa o seguinte:

long start = System.nanoTime(); ... processamento long stop = System.nanoTime(); double demorou = (double)(stop-start)/[telefone removido];

Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html

Espero que ajude.
Abraço

como funciona esse conceito de produto-consumidor? e como posso fazer para usar threads?

No seu caso, não precisa de tudo isso. Tem poucos registros a serem tratados.
Se quiser fazer a título de conhecimento, neste tutorial tem a base sobre concorrência.
http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
No tópico Guarded Blocks fala sobre o padrão producer-consumer
e em Questions and Exercises, no Check your Answers tem a solução de exemplo usando o BlockingQueue.

javaflex

guilhermecoelho2:
Me surgiu essa curiosidade agora.

No caso tenho duas funções, uma para ler um arquivo csv e outra para gravar os dados lidos no sqlite. Em questão de performace o que é melhor, ir gravando no banco conforme for lendo as linhas do csv ou ir populando um objeto com os dados lidos só depois chamar a função que grava no banco passando o objeto populado

E aproveitando, tem algum modo para verificar quanto que um processo está consumindo de memória e seu tempo de processamento?


Coisas relativas a importação de dados não precisa ter algo no meio só por preciosismo de OOP. Use o máximo que o SGDB oferecer, como por exemplo o BULK INSERT do SQL Server, como não conheço o SQLite procure algo similar, senão tiver solução em lote faça o insert o mais direto possível.

Criado 15 de março de 2013
Ultima resposta 16 de mar. de 2013
Respostas 9
Participantes 6