análise estatística e multi threading - Qual linguagem usar?

Oi pessoal,

Estou prestes a começar a trabalhar em um projeto em que vamos aplicar análise estatística sobre uma quantidade razoável de dados. A ideia é desenvolver utilizando multithreading.

As linguagens que estão em pauta são python, c++ e java. O que recomendam? Alguma dessas tem algo pronto pra estatística?

Pesquisei um pouco e vi que existem frameworks para integrar c++ com R. Alguém conhece e pode falar um pouco sobre?

Outra coisa que vi (no head first python) é que não é uma boa ideia usar python para programar com multithreading. Alguém pode comentar sobre isso também?

Rodrigo.

Não quer fazer a análise usando um pacote como o R ( http://www.r-project.org/ ) ? É de graça e muito bom.

Se for usar C++, dê uma olhada:
http://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/index.html
http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html

A boost::thread foi incorporada ao C++11, junto com lambda.

Como aplicações estatísticas são geralmente altamente CPU-Bound, recomendo uma linguagem de baixo nível ou um framework específico para isso, principalmente se o volume de dados for gigantesco. É um dos poucos casos que o Java e o Python realmente perdem feio em questão de desempenho.

Não quer fazer a análise usando um pacote como o R ( http://www.r-project.org/ ) ? É de graça e muito bom. [/quote]

É, tem um pessoal do projeto que já vem usando R. Mas pelo que vi não dá pra programar com threads em R. Vi algo chamado RCPP pra integrar c++ e R. Vou dar uma olhada nisso. Outras sugestões são bem vindas.

[quote=ViniGodoy]Se for usar C++, dê uma olhada:
http://www.boost.org/doc/libs/1_35_0/libs/math/doc/sf_and_dist/html/index.html
http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html

A boost::thread foi incorporada ao C++11, junto com lambda.

Como aplicações estatísticas são geralmente altamente CPU-Bound, recomendo uma linguagem de baixo nível ou um framework específico para isso, principalmente se o volume de dados for gigantesco. É um dos poucos casos que o Java e o Python realmente perdem feio em questão de desempenho.[/quote]

Gostei! Vou ver isso direito.

Vai de C++!

Eu faria os cálculos de complexidade e estatística baseado em algoritmos, depois buscando a melhor linguagem de implementação para o algoritmo selecionado.
Tudo que for feito em baixo nível desde que bem feito tem um desempenho em relação a tempo e memória incrivelmente melhores, mas deve considerar o tempo para implementação, já que escrever código em assembly para solução de problemas complexos leva um tempo consideravelmente maior que a implementação em uma linguagem amigável.
Caso escolha realmente implementar em baixo nível utilize arquitetura CISC é de mais fácil trabalho com paralelismo.

Uma alternativa à linguagens pouco “amigáveis” é usar uma linguagem de alto nível com suporte a concorrencia e distribuição embutido na linguagem. Algumas opções são Erlang, Clojure e Scala.

Realmente a alternativa para facilitar o trabalho evitando linguagens de baixo nível são as linguagens de alto nível, mas no caso em questão o foco parece ser desempenho, não oque roda o algoritmo que torna a implementação de bom desempenho mas como roda, quando se trabalha em baixo nível eliminando conceitos como OO, OC, OE, OA, etc, pode-se construir um código altamente maleável, não estamos preso a conceitos e linhas de produção então mixamos oque nos parece prudente da forma mais econômica e prudente possível.

No fim das contas todos as linguagens de programação se tornam código de máquina que são refeitos por micro-programas e partem para trilhas físicas. (Segundo argumento do CREA, software é um hardware maleável)
“Não são materiais e sim a forma que se pode utilizar as peças”
“Quando não há forma a criatividade reina e as fraquezas se mostram, cabe ao indivíduo as diminuir a criatividade ou as fraquezas”

Realmente a alternativa para facilitar o trabalho evitando linguagens de baixo nível são as linguagens de alto nível, mas no caso em questão o foco parece ser desempenho, não oque roda o algoritmo que torna a implementação de bom desempenho mas como roda, quando se trabalha em baixo nível eliminando conceitos como OO, OC, OE, OA, etc, pode-se construir um código altamente maleável, não estamos preso a conceitos e linhas de produção então mixamos oque nos parece prudente da forma mais econômica e produtiva possível.

No fim das contas todos as linguagens de programação se tornam código de máquina que são refeitos por micro-programas e partem para trilhas físicas. (Segundo argumento do CREA, software é um hardware maleável)
“Não são materiais e sim a forma que se pode utilizar as peças”
“Quando não há forma a criatividade reina e as fraquezas se mostram, cabe ao indivíduo as diminuir a criatividade ou as fraquezas”[/quote]

Como você distribui a carga de trabalho em diferentes nós/processadores para serem executados em paralelo em C/C++? Pergunto porque não tenho a menor idéia mesmo, por outro lado é tranquilo ser feito usando linguagens de alto nível.