quinta-feira, 8 de novembro de 2012

Faster Than Grep


Ele estava parecendo um dia chato. I got no final, quase 11 (BAD, eu costumo trabalhar 10:30-18:30), e às 11:30 tinha pregado todo o material de manutenção diária e foi olhando para uma série de impasse e espera-para-outros-caras empregos. E alguns trabalhos épicos que realmente não poderia ser promovido hoje. Então o gerente ops andou até mim ...

"O que é mais rápido que o grep?"

Se você não é um nerd, grep é uma coisa muito versátil e muito rápido você procurar arquivos de texto com. Se alguém importante quer algo mais rápido que o grep, eles são ou em uma pressa profana, ou ter um caminhão de dados.

Ou pior dos casos, como neste caso, os dois.

Quarenta e quatro giga de dados ao todo, uma lista de 180k de cerca de 13.000 registros para puxar para fora. Comprimento variável de dados de texto, um cenário de pior caso. E nós precisamos a informação extraída amanhã de manhã. Ah, e você precisa combinar dois campos diferentes.

Grande.

A boa notícia? O primeiro campo tem um monte de duplicatas. É 13.000 registros, mas apenas 220 única no primeiro campo. Eu sinalizar que como "interessante".

O problema com um grep anelada é, você está girando rápido o Big Wheel eo lento roda pouco. Você está ciclismo através 44gig de dados 13.000 vezes. Nada vai estar na RAM (este é de 2006, e eu ainda não tenho uma caixa com 64 GB de RAM darnit .. eu furei um em no meu último emprego, com 32 embora). Então eu venho para ele de outra direção. Um comando grep repetida foi literalmente levando dias (foi tentado antes que me entregou o problema)

Eu escrevi algo mais rápido que o grep antes. Mas eu me enganei, então, e indexados os dados usando algo chamado CDB, que é o sistema de banco de dados mais rápido que eu já vi (procurá-lo, é verdadeiramente annihilative). Mas hoje eu não tinha tempo para nada índice ..... uma passagem que ia ter que ser suficiente. Como eu faço isso?

Escrevi em C. Sem brincadeira, que o volume de dados, eu preciso a ferramenta mais rápida _performing_ eu posso encontrar, ou que vai levar semanas. Compilar com-O3! PHP levaria tempo maneira menos ao código, salvando uma ou duas horas mesmo, mas levar dias mais tempo para executar.

A primeira coisa que fiz foi carregar os 13.000 conjuntos de dois campos em uma matriz. Isto significa que os dados que fazem a maior parte do trabalho foi preso na RAM, e apenas teve de percorrer o 44PT de lixo uma vez. Isso é uma coisa boa.

Muitos bugs se seguiu. O material C de costume ... você cortar alguma coisa juntos e segfaults as primeiras 100 vezes que você executá-lo, enquanto você correr loucamente colocando declarações de impressão em todos os lugares tentando descobrir onde o fogo é. Enquanto isso, o relógio está correndo e patrão do meu patrão está sentado próximo a mim ou passeando ao redor seu escritório olhando preocupado. Tic Tac.

Tenho a coisa funcionar, e movê-lo sobre a caixa HPUX que tem todos os dados sobre ele. Eu não tinha sequer vim nessa caixa, então eu codificado primeiro-se no meu desktop linux. Eu iniciá-lo lá em cima em uma pequena amostra dos dados que tinham estado a trabalhar no meu desktop.

Ele trava. E falhas. E falhas. Eu me deparo com bug depois bug nas bibliotecas terríveis HP. sscanf não funciona nada como isso faz sob libc GNU. Eu estou pronto para mover os dados fora em um servidor linux pesado quando o meu chefe (não patrão do meu patrão) menciona que ele está instalado o compilador GNU e bibliotecas na máquina hpux. Sweet! Compila primeiro ir, corre primeiro ir agora.

Só que é muito lento.

"O que é cpu neste homem coisa?"

"Uhhh Eu acho que é 360MHz 4x"

"$% #%!"

Eu começar a transferir os dados para o servidor linux pesado citada. Ele tem cerca de 10 vezes a potência do processador. Eu tenho uma breve discussão com Engenharia IP sobre deixar-me através do Firewall Agora PLZ. Então, ela começa ..... 5MB qualquer um segundo? Este é o tipo de coisa, eu mencionar, que seria útil para atualizar para Gigabit Ethernet para. Tic Tac.

Horas mais tarde .... As horas são boas de certa forma, eles me dão tempo para fazer um pouco de outro trabalho e pensar em como fazer o meu programa hackeado em conjunto ir mais rápido.

A primeira coisa é, eu percebo, me batendo na cabeça, que eu estou combinando coisas e depois continuar a comparar o resto do 13.000 queria registros para a linha depois que foi combinado! Eu corrigir isso, e então eu me lembro a coisa "interessante" de antes.

220 registros exclusivos no primeiro campo apenas. Eu escrevo um loop (eu odeio C, este seria um outro de uma linha em php:.. () Para encontrar estes e colocá-los em uma matriz eu uso essa matriz para registro de "tela" cada um antes de verificá-lo Se o isn primeiro campo 't no 220, a linha não se comparado ao 13.000 - nós ignorá-lo e seguir em frente.

Isso retarda meus dados de amostra visivelmente. Mas eu sei que a minha amostra de dados tem um número anormalmente elevado de partidas - Eu acho que o meu programa está apenas fazendo um extra de 220 comparações em cada linha para que os dados, enquanto que a maior parte dos dados reais serão pulou rapidamente por este código. Como faço para testar essa teoria? Eu sou capaz de executar o programa no arquivo incompleto o download. Não tente fazer isso no Windows :) Eu estou conseguindo o que se parece com bons resultados. É rápido, e está recebendo os dados.

Eu estou correndo fora de horas. A primeira metade dos dados (feliz que seja em dois arquivos separados agora!) É terminar o download e eu começo a trabalhar nele de verdade. Parece bom ... está combinando coisas, eo contador que eu tenho no programa que imprime uma linha quando se chega a um milhão é de corte passado rapidamente. Os pontos mortos nos dados sem registro na lista de 220 voar passado, e eu estimo que vai levar apenas 90 minutos para atravessar o primeiro arquivo! 285 milhões de registros em 90 minutos é muito bem por mim.

NÓS VAMOS GANHAR.

O resto é fácil. Algumas horas mais tarde, o segundo arquivo termina o download. Eu iniciá-lo e caminhar para casa. Ele é feito na hora que eu chegar lá e VPN dentro Sweet. Início de 09:00, eo trabalho feito!

Hoje lembrei-me porque eu amo meu trabalho....

Nenhum comentário:

Postar um comentário