Mais uma curiosidade do que dúvida. Performace

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.