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?
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)/1000000000;
Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html
Espero que ajude.
Abraço
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…
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?
[quote=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…
[/quote]
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.
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.
[quote=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?[/quote]
é 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
[quote=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)/1000000000;
Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html
Espero que ajude.
Abraço[/quote]
como funciona esse conceito de produto-consumidor? e como posso fazer para usar threads?
[quote=guilhermecoelho2][quote=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)/1000000000;
Um exemplo, veja o MyLocationService.java: http://agorandroid.blogspot.com.br/2012/12/content-provider-usando.html
Espero que ajude.
Abraço[/quote]
como funciona esse conceito de produto-consumidor? e como posso fazer para usar threads?[/quote]
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.
[quote=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?
[/quote]
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.