Pergunta

Estou a desenvolver em python, ainda novo para o jogo, e eu quero ter certeza que eu resolver o problema corretamente.Eu vou aceitar de bom grado, todos os conselhos.

Imagine que está tentando usar dados guardados em vários arquivos simples, em muitos casos, com um tamanho total superior a 20-35 gb.No caso mais geral, esses arquivos podem ser delimitado por vírgulas (csv, tab) ou pode ser simplesmente de largura fixa.O objetivo é levar estes arquivos, ou algum subconjunto de cada arquivo, analisar a entrada (cada coluna representa uma variável de dados), e enviá-lo para algum destino (que pode ser local ou remoto do sql, alguns outros locais de arquivo em uma variedade de formatos de saída, incluindo texto ou alguns proprietários de dados com o formato do stata .dta)

O objetivo é usar os recursos do sistema disponíveis para realizar esta operação da forma mais rápida possível ( eu acho que em termos de kb por segundo?)

Perguntas:

  1. Há um ganho de eficiência de uso C compilado para fazer as operações de leitura?Se assim for, a biblioteca de que eu deveria aprender como usar?E, no caso de c também fazer a análise e a saída?

  2. Se o arquivo vem em um .ou zip .gz, deve a todo o arquivo a ser descompactado antes de ler e escrever, ou fazer você deixar compactado e usar uma biblioteca capaz de ler a partir do arquivo compactado?

  3. Se o programa utilizar multi-threading?Eu imagino que a leitura de algum subconjunto de um arquivo (digamos, n linhas ao mesmo tempo), de análise e de saída, digamos, j threads.Não é óbvio que a leitura de uma linha do arquivo de cada vez é o ideal...e parece que o número ideal de threads e processos irá depender dos recursos disponíveis e o tamanho da tarefa.
    Assim, talvez o código deve ser "inteligentes" o suficiente para otimizar a determinar quantas threads a utilizar e quanto trabalho cada thread deve ser esperado para o fazer.

  4. Como se faz para medir e comparar a eficiência entre diferentes métodos?

  5. Se o programa é capaz de fazer isso de forma dinâmica e escolher a entrada de saída de métodos com base no seu desempenho?(Vai Um método sempre estritamente dominar o método B, ou idiossincrática alterações no ambiente de implantação assunto)

Apenas para ser claro, eu estou disposto a aceitar quase qualquer nível de código de ineficiência em troca de não negligenciável de melhorias na eficiência de recursos

Espero que essas perguntas fornecer uma clara idéia do que estou tentando descobrir.Minha experiência em programação é confinada a científica/pacotes estatísticos, por isso, se qualquer uma das minhas perguntas se resumem a "rtm", por favor seja gentil e sugerir o manual apropriado.

Foi útil?

Solução

Há um ganho de eficiência de uso C compilado para fazer as operações de leitura?

Não realmente.A limitação deverá ser de e/S de largura de banda e Python usa o subjacente C bibliotecas.

Se o arquivo vem em um .ou zip .gz, deve a todo o arquivo a ser descompactado antes de ler e escrever, ou fazer você deixar compactado e usar uma biblioteca capaz de ler a partir do arquivo compactado?

Primeiro, faça de tudo para funcionar bem.Não tente utilizá-lo de frente.Python ZipFile implementação pode processar arquivos no formato CSV abrindo o arquivo ZIP membros, sem expandir-los.

Isto é mais rápido?Você não pode saber com antecedência.Você só pode conhecer através da construção e medir o que você construiu.Não torça as mãos.Apenas algumas linhas de código.Compilação de ambos.

Deve-programa de uso de multithreading?

Não.

O uso de nível de sistema operacional de multi-processamento.

python something.py source.zip | python part2.py | python part3.py | python part4.py >result

Isso será extremamente rápida e sem muito trabalho -- vai usar todos disponíveis OS recursos.

Como se faz para medir e comparar a eficiência entre diferentes métodos?

Ummm...Essa é uma pergunta idiota.Você construí-lo e medi-lo.Decorrido o tempo é como uma boa medida de quanto qualquer outra coisa.Se você está confuso, use um cronômetro.Sério.Não há mágica.

Se o programa é capaz de fazer isso de forma dinâmica e escolher a entrada de saída de métodos com base no seu desempenho?

Não.

(Vai Um método sempre estritamente dominar o método B, ou idiossincrática alterações no ambiente de implantação assunto)

Sim.E Sim.Alguns métodos são sempre mais eficientes.No entanto, um sistema operacional é hellishly complexo, por isso, nada substitui simples, flexível, modular design.

Compilação de peças simples que podem ser recombinados de forma flexível.

Não de mão-escorra-o com antecedência.O Design com estrutura de dados e algoritmos, quando você pode.Quando você não pode, basta escolher algo sensato e seguir em frente.A construção de algo e o ajuste é muito mais fácil do que irritado com detalhes apenas para descobrir que eles nunca se importava.

  1. Construir Algo.

  2. Medida.

  3. Encontrar o gargalo.

  4. Otimizar apenas comprovada gargalos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top