Melhor maneira de fazer um grande arquivo binário?

3

Qual é o caminho mais rápido para o arquivo binário 400gb grep? Eu preciso de um arquivo txt do HDD despejo e sei algumas seqüências de caracteres e quero encontrar esse arquivo no despejo.

Eu tentei usar o grep -a-C 10 searchstring, mas o grep trava com falta de memória quando ele tenta ler um grande bloco de dados sem símbolos de nova linha. Também gostaria de começar a pesquisar não desde o começo, mas de algum ponto do arquivo

    
por Just User 13.08.2015 / 22:41

2 respostas

6

Eu usaria strings dessa maneira:

strings 400Gfile.bin | grep -C 10 searchstring

Para começar em um determinado deslocamento (por exemplo: 20G),

dd if=400Gfile.bin bs=20G skip=1 | strings | grep -C 10 searchstring
    
por 13.08.2015 / 22:50
1

O problema com o grep é que ele precisa ter uma linha inteira na memória. Se essa linha é tão grande que não cabe na memória, que as bombas grep. A única maneira de contornar esse dilema é alimentar pequenos pedaços para o grep. (que é realmente o que o grep deve estar fazendo por si mesmo, mas não funciona)

Use dd para que você possa especificar um deslocamento para iniciar em e use fold ou grep --mmap para evitar a falta de memória em uma linha maior que a RAM disponível. grep --mmap impedirá o sistema de sufocar, mas pode ou não impedir que o próprio grep se sufoque. Isso seria bom para alguém testar. fold permitirá que você insira uma nova linha em intervalos regulares, isso satisfaz os critérios para dividir a entrada em partes gerenciáveis.

dd if=bigfile skip=xxx | fold | grep -b -a string

O -b fornece o deslocamento de bytes que você achará útil para saber onde suas cadeias de texto estão localizadas no arquivo.

Eu testei isso em um volume lógico de 100 GB em um dos meus hypervisors KVM, usando a string de pesquisa "Hard" e executando o vmstat em uma janela separada para monitorar o desempenho. O volume lógico é basicamente formatado como um disco rígido (partições e sistemas de arquivos) no qual uma VM Linux convidada está instalada. Não houve impacto no desempenho do sistema. Ele processou cada show em cerca de 33 segundos (claro que isso irá variar muito dependendo do seu hardware).

Você disse que queria um desempenho rápido. Isso deve dar a você o desempenho mais rápido do uso de utilitários em um script de shell. A única maneira de obter uma pesquisa mais rápida seria escrever um programa em C que busca um deslocamento, lê um chunksize especificado, alimenta esse fragmento em um algoritmo de correspondência de padrões, antes de passar para o próximo bloco. Parece que esse tipo de "grep aprimorado" já deveria estar em existência, mas pesquisando on-line eu não encontro um.

    
por 14.08.2015 / 00:44