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 csv
arquivos 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 csv
arquivo 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 csv
arquivos 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.
fonte
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.
fonte
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.
fonte
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
cat
e 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
.h5
arquivo 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.
fonte