Eu quero extrair todas as linhas $file1
que começam com uma string armazenada em $file2
.
$file1
tem 4 GB de tamanho com cerca de 20 milhões de linhas, $file2
tem 2 milhões de linhas, tem cerca de 140 MB de tamanho e contém duas colunas separadas por ,
. O comprimento máximo de linha de ambos os arquivos está bem abaixo de 1000, eles são classificados com LC_ALL=C
e $file1
podem conter quaisquer caracteres adicionais, exceto \0
.
Inesperadamente este comando
parallel --pipepart -a $file1 grep -Ff $file2
consome uma quantidade extrema de memória e é morto pelo sistema operacional.
O comando funciona se eu limitar o número de threads:
parallel --pipepart -j 8 -a $file1 grep -Ff $file2
Para o último comando, htop revela que cada grep -Ff $file2
-thread ocupa constantemente 12,3 GB de memória. Suponho que essa demanda venha do dicionário grep compilado do $file2
.
Como posso obter esse filtro com mais eficiência?
Ele é abordado em
man parallel
https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Grepping-n-lines-for-m-regular-expressions