Extrai o arquivo bzip2 linha por linha

1

Eu tenho um arquivo bzip2 de 17GB que contém 126 milhões de objetos json. Um em cada linha. Eu gostaria de realizar alguns cálculos em cada objeto json usando jq .

Infelizmente, o processamento do arquivo bzip2 leva muito tempo.

  1. ) Eu tentei colocar o documento em / dev / shm para que ele esteja na RAM.
  2. ) Eu tenho 56 núcleos para trabalhar e 256GB de RAM, então eu tentei pbzip2 -d para descompactar, no entanto, parece não me dar nenhuma aceleração razoável.

pbzip2 -m5000 -d --stdout measurement.json.bz2 | pv -l -cN pbzip2 | parallel --pipe --line-buffered 'jq -rc "select(.value.error==null)"' | pv -l -cN results > out.res

Infelizmente, isso só me dá cerca de 20k linhas / s no nível pbzip2, o que leva cerca de duas horas para uma varredura completa no documento.

O problema é que, como o documento contém muitos objetos JSON independentes, acho que não é necessário descompactá-lo de cima para baixo. Existe uma maneira de descomprimir em paralelo um arquivo bzip2 em uma base por linha para melhor utilizar a paralelização?

    
por mightyuhu 16.08.2017 / 20:45

1 resposta

1

bzip2 e os amigos são de segmentação única. Isso se traduz no fato de que os arquivos compactados com regular bzip2 não verão um aumento de velocidade quando descompactados com pbzip2 . Este é um fato muito pouco apreciado em configurações de muitos núcleos.

Então, basicamente, você está descomprimindo em um único núcleo, limitando sua taxa de transferência. Não há como eu saber disso, desde que você não tenha a possibilidade de fazer com que o lado de compressão use um compressor amigo do ambiente.

    
por 16.08.2017 / 21:12