Devo usar um banco de dados para lidar com grandes quantidades de resultados?


8

Fundo:

Atualmente, estou executando uma grande quantidade de experimentos de variação de parâmetros. Eles estão sendo executados no Python 2.6+, usando numpy. Esses experimentos levarão cerca de 2 semanas para serem executados.

Aproximadamente, estou variando três parâmetros (variáveis ​​independentes) em um intervalo de valores. Estou corrigindo mais 6 variáveis ​​independentes (por enquanto) estou relatando 4 variáveis ​​dependentes.

Um dos parâmetros que estou variando está sendo distribuído por vários processos (e computadores). Para cada um desses parâmetros, eu gero csvarquivos separados com cada linha contendo os valores de todas as variáveis ​​(incluindo independentes, fixas e dependentes). Em toda a variação, esperamos gerar cerca de 80.000 linhas de dados

Na maioria das vezes, estou apenas olhando o valor de uma das variáveis ​​dependentes, mas mantenho as outras por perto, pois elas podem explicar o que está acontecendo quando algo inesperado acontece.

Em uma versão anterior desse experimento, variando entre apenas 2 parâmetros (cada um com apenas 2 valores), eu estava copiando colando esse csvarquivo em um programa de planilha e fazendo várias colagens de cópia para criar uma tabela apenas da variável dependente que me interessava Fazer algumas coisas estranhas no MS-Excel para me deixar ordenar por fórmulas. Isso foi doloroso o suficiente para os 6 conjuntos de resultados de experimentos que tive. No momento em que essa execução terminar, terei 2 ordens de magnitude a mais.

Questão:

Eu estava pensando que, uma vez feito, poderia despejar todos os resultados dos csvarquivos em um banco de dados e consultar as partes que são interessantes. Em seguida, pegue esses resultados e coloque-os em uma planilha para análise. Fazer gráficos, encontrar pontuações em relação aos resultados do controle, etc.

Estou pensando na linha certa? (É isso que as pessoas fazem?)

Hoje em dia, meu banco de dados está bastante enferrujado, mesmo quando era bom eu estava usando o MS-Access. Eu pretendia usar o MS-Access para isso também.

Respostas:


8

Eu sugeriria que um banco de dados completo pode ser um exagero para seus propósitos, embora certamente funcione. Mesmo linhas não devem ter mais do que 25mb de dados.5105

Eu recomendo fortemente fazer a análise / plotagem / etc com a mesma ferramenta que você usará para consultar seus dados. É minha experiência que, ao alterar o que analisar, é necessário alterar apenas 1 linha de código e aguardar 2 segundos, é muito mais fácil obter o máximo de seus dados. A colagem de cópias também é ALTAMENTE propensa a erros. Vi várias pessoas em desespero porque seus dados não faziam sentido, apenas para perceber que cometeram um erro ao copiar dados em sua planilha do Excel.

Se você está familiarizado com o python, sugiro usar pandas ou (se você tiver mais dados do que pode caber na memória) pytables , o que lhe dará todas as vantagens de um banco de dados (incluindo velocidade). O Pandas possui muitas funções utilitárias para plotagem e análise de dados, e você também teria a pilha científica completa de python. Dê uma olhada neste notebook ipython para um exemplo de uso de pandas.

Acredito que existem ferramentas semelhantes para R, bem como softwares comerciais como Matlab ou Stata.

O HDF5 é uma boa maneira genérica de armazenar os dados inicialmente e possui um bom suporte de biblioteca em vários idiomas.


Eu preciso estar analisando e gerando meus dados separadamente. Meus dados levarão duas semanas para serem gerados. Isso muda alguma coisa na sua resposta?
Lyndon White

Desculpe, eu não estava sendo clara. Quero dizer que a ferramenta que você usa para consultar seus dados deve ser a mesma que faz sua análise e seus gráficos. É uma grande vantagem poder refazer tudo simplesmente executando 1 script. Eu armazenaria os dados em hdf5, mas se você preferir um banco de dados SQLite (como sugerido por Geoff), também poderá ler isso com SQLAlchemy em python.
LKlevin

Ah, certo, isso faz mais sentido. E você também está defendendo uma análise programática e repetível
Lyndon Branca

Sim! Respondendo à pergunta "como exatamente eu fiz a análise dos dados neste gráfico?" é muito mais fácil quando você pode simplesmente ver o script fazendo a coisa toda.
LKlevin

Agora que comecei a análise usando o Pandas, sinto que posso aceitar esta resposta.
Lyndon White

5

Eu recomendo usar uma ferramenta como Sumatra para isso. Eu costumava ter uma abordagem "pedestre" semelhante à sua para rastrear muitas execuções de simulação com parâmetros variáveis, mas no final isso se torna uma grande bagunça, porque é quase impossível projetar uma abordagem ad-hoc corretamente de antemão e antecipar todos os casos de uso e extensões necessários (por exemplo, o que acontece se você precisar introduzir um parâmetro adicional).

O Sumatra rastreia todas as suas simulações e as armazena em um banco de dados que pode ser consultado posteriormente (usando sua API Python) para filtrar e analisar os registros nos quais você está interessado. É muito flexível e não impõe um fluxo de trabalho a você, que eu acho uma grande vantagem. Além disso, ele vem com uma interface da web que permite procurar rapidamente resultados (ou inspecionar / baixar arquivos gerados), o que é tremendamente útil. O banco de dados padrão usa SQLite e eu poderia imaginar que ele se tornará um pouco lento se você usá-lo para armazenar mais de 80.000 resultados de simulação. Existe um back-end do PostgreSQL, mas eu nunca o usei, portanto não posso garantir seu desempenho.

Devo dizer que ainda está em seu estágio inicial de desenvolvimento e faltam algumas coisas, mas eu o usei para praticamente todas as minhas simulações no ano passado e salvou meu dia tantas vezes que eu não conseguia imaginar o que eu faria sem ele. Pessoalmente, nunca o usei para cálculos em computadores diferentes (ou em um cluster), mas acho que ele suporta esse tipo de fluxo de trabalho. Pergunte na lista de discussão se não tiver certeza ou não encontrar exatamente o que precisa, é uma comunidade pequena, mas muito amigável e útil.

Diga-me se isso é do seu interesse e estou feliz em compartilhar meu código de fluxo de trabalho e de clichê para ajudá-lo (ou apenas por inspiração).

Para a análise real dos dados, concordo com LKlevin que os pandas e o notebook IPython são ferramentas extremamente úteis para conhecer (o Sumatra permite importar os registros para pandas, embora isso seja um pouco no momento, mas tenho certeza de que em breve será melhorado). Eu também poderia imaginar que salvar resultados de dados / simulação no formato HDF5 poderia ser útil; nesse caso, o pytables é uma boa ferramenta na caixa de ferramentas. (Lembro-me de que o suporte ao HDF5 está planejado em Sumatra, mas não consigo encontrar as informações no momento e não tenho certeza se isso foi implementado ainda.)

Por fim, tenho certeza de que existem outras ferramentas que ajudam nesses tipos de tarefas (consulte a "lista curta" neste slide da apresentação ). Mas, pessoalmente, não experimentei nenhum deles, porque fiquei muito feliz com a funcionalidade e flexibilidade que o Sumatra oferece.


1

Sim, você pode despejar todos os resultados em um banco de dados e, sim, algumas pessoas optam por usar bancos de dados. Ainda não tive que lidar com situações usando bancos de dados, mas lecionei em oficinas onde outros instrutores ensinam sobre o uso de bancos de dados para coletar dados. Para bancos de dados que não são enormes, pelo que entendi, a tecnologia subjacente não importa muito. Meu co-instrutor usou o SQLite3. É fácil de instalar no Linux, é padrão no OS X e acredito que esteja disponível para Windows.

É possível acessar bancos de dados SQLite através de um terminal no OS X e Linux; Não tenho certeza de como isso é feito no Windows. Também é possível aproveitar os pacotes Python para ler e gravar no banco de dados programaticamente, por exemplo, usando o pacote sqlite3 na biblioteca padrão do Python.

Se seus conjuntos de dados ficarem realmente grandes, outras implementações de banco de dados serão melhores e, nesse ponto, você provavelmente desejará consultar um especialista em banco de dados.


1

Se todos os seus dados couberem confortavelmente na memória (por exemplo, abaixo de 1 GB, para que você tenha margem para a análise), um banco de dados é um exagero. Você pode apenas ler o arquivo inteiro na memória e selecionar as peças que deseja. Por outro lado, quando seus dados começam a crescer (ou podem potencialmente crescer muito), um banco de dados pode oferecer consultas rápidas e fáceis ( "me dê todas as velocidades nas quais a energia era exatamente 2 e a temperatura maior que 27" )

Outro tópico é a geração de dados. Como seus dados levam duas semanas, eu suponho que você os esteja gerando em um cluster de computação em paralelo. A configuração de um banco de dados para gravação paralela é complexa e pode potencialmente retardar o processo, pois os dados estão sendo transferidos e os bloqueios estão em vigor. Como você só precisa escrever as coisas uma vez, é possível que cada processo gere seu próprio arquivo de texto temporário, escreva os resultados lá e faça com que um processo central leia cada uma delas e despeje-a em um banco de dados mestre. Para o caso mais simples, esse script pode ser simples cate salvar o resultado como texto sem formatação.

Agora, vamos supor que você queira usar um banco de dados. Se o seu caso de uso for algo um pouco mais avançado que um arquivo de texto (o que você faria se tivesse carregado um CSV com Numpy), recomendo o HDF5 através do PyTables. É rápido, simples de configurar, compatível com Numpy e com vários recursos avançados, se você deseja ajustar as coisas. Ele também suporta compactação, consulta e salvamento de matrizes. Também é fácil de instalar no Linux, Windows e Mac. O layout de dados do HDF5 nada mais é do que tabelas, como uma planilha. O .h5arquivo resultante pode ser lido de vários idiomas do computador se eles tiverem a biblioteca adequada instalada.

Por outro lado, você tem SQL. Você tem um no stdlib do Python, portanto já o teria instalado, mas não é muito adequado para trabalhos numéricos (não é possível salvar e recuperar matrizes Numpy tão facilmente, por exemplo). Essa é a melhor opção se você precisar de terceiros para fazer interface com outros idiomas, pois é muito conhecido e há wrappers para quase qualquer idioma, muitos deles vêm por padrão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.