Paralelizando sqlite3_exec

2 views
Skip to first unread message

P.

unread,
Oct 20, 2009, 8:30:33 PM10/20/09
to ccppbrasil
Senhores,

tenho um banco de dados sqlite3 gigante com números -- marcações de
início e fim de operações em um sistema para medições de desempenho.

O objetivo é calcular diversos números interessantes, como médias,
desvios etc.

Infelizmente para mim, a API básica para se percorrer as linhas de uma
consulta na sqlite3 -- sqlite3_exec -- não usa todos os processadores
do sistema onde o programa vai rodar. Eu gostaria de ocupar todos os
processadores nesse sistema ao máximo que for possível, porque os
cálculos realmente demoram muito tempo.

Alguém já passou por experiência parecida, com sqlite3 ou algum outro
tipo de RDBMS? Como paralelizar o processamento de linhas de uma
consulta?

--
P.

Alex Queiroz

unread,
Oct 20, 2009, 8:45:33 PM10/20/09
to ccppb...@googlegroups.com
Hallo,

2009/10/20 P. <pedro....@member.fsf.org>:


>
>
> Infelizmente para mim, a API básica para se percorrer as linhas de uma
> consulta na sqlite3 -- sqlite3_exec -- não usa todos os processadores
> do sistema onde o programa vai rodar. Eu gostaria de ocupar todos os
> processadores nesse sistema ao máximo que for possível, porque os
> cálculos realmente demoram muito tempo.
>

Você pode fazer um fork() e então abrir o banco de dados
(sqlite3_open) a partir dos vários processos, isso não irá corromper o
arquivo do banco de dados.

--
-alex
http://www.ventonegro.org/

Murilo Adriano Vasconcelos

unread,
Oct 20, 2009, 8:57:39 PM10/20/09
to ccppb...@googlegroups.com
Pensei numa idéia trabalhando com threads.

Se sua consulta é por exemplo um select, você pode dar um limit específico e trabalhar com os dados em cada thread

tipo
th1 : select ... from ... limit 0, 15
th2 : select ... from ... limit 15, 15
th3: select ... from ... limit 30, 15

etc...
Nunca tinha pensado na idéia em trabalhar com paralelismo em banco de dados... Espero atentamente respostas para esse thread para aprender também!


2009/10/20 Alex Queiroz <asan...@gmail.com>



--
Murilo Adriano Vasconcelos
Ciência da Computação INF-UFG
Universidade Federal de Goiás
http://murilo.wordpress.com

Virgilio Alexandre Fornazin

unread,
Oct 20, 2009, 9:10:36 PM10/20/09
to ccppb...@googlegroups.com

Pedro

 

Isso que você esta tentando fazer depende muito da sequencia em que você precisa que seus dados sejam processados.

 

Nos sistemas em que trabalho, tenho um thread pool para executar as requisições que manipulam o banco de dados, mas elas

podem ocorrer assincronamente (algumas não, e essas são serializadas para a mesma thread).

 

Eu não faço ideia do tipo de dado que você está manipulando e quais tipos de cálculos você esteja fazendo, se der alguma

noção do que seja (exemplos, etc), acho que da para te ajudar.

 

Eu ja fiz algumas coisas do tipo: 1 resultset que gera uma matriz que depois era reprocessada e gerava outra. Nesse caso, pode

ser uma 1 thread que vai gerando a primeira matriz e outra thread que va calculando a segunda matriz a partir da primeira.

 

Mas como cada caso é um caso, se puder dar mais informações acho que podemos te orientar com isso.

Raphael M.

unread,
Oct 20, 2009, 11:27:39 PM10/20/09
to ccppb...@googlegroups.com
Porque não gera um resultset e efetua a transformação que quiser utilizando o esquema Produtor/Consumidor, com threads?

2009/10/20 Virgilio Alexandre Fornazin <virgilio...@gmail.com>
Reply all
Reply to author
Forward
0 new messages