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?
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
A_H_Gusukuma
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
entanglement
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”:
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
guilhermecoelho2
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
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];
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.