deduplicação de linhas em um arquivo grande

3

O tamanho do arquivo é 962,120,335 bytes.

HP-UX ****** B.11.31 U ia64 ****** licença de usuário ilimitado

hostname> what /usr/bin/awk
/usr/bin/awk:
         main.c $Date: 2009/02/17 15:25:17 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
         run.c $Date: 2009/02/17 15:25:20 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
         $Revision: @(#) awk R11.31_BL2010_0503_1 PATCH_11.31 PHCO_40052
hostname> what /usr/bin/sed
/usr/bin/sed:
         sed0.c $Date: 2008/04/23 11:11:11 $Revision: r11.31/1 PATCH_11.31 (PHCO_38263)
         $Revision: @(#) sed R11.31_BL2008_1022_2 PATCH_11.31 PHCO_38263
 hostname>perl -v
    This is perl, v5.8.8 built for IA64.ARCHREV_0-thread-multi
hostname:> $ file /usr/bin/perl
/usr/bin/perl:  ELF-32 executable object file - IA64
hostname:> $ file /usr/bin/awk
/usr/bin/awk:   ELF-32 executable object file - IA64
hostname:> $ file /usr/bin/sed
/usr/bin/sed:   ELF-32 executable object file - IA64

Não há ferramentas GNU aqui.
Quais são minhas opções?

Como remover linhas duplicadas em um grande arquivo de texto multi-GB?

e

link

perl -ne 'print unless $seen{$_}++;' < file.merge > file.unique

lança

Out of Memory!

O arquivo resultante de 960 MB é mesclado a partir dos arquivos desses tamanhos listados abaixo, sendo a média de 50 MB 22900038, 24313871, 25609082, 18059622, 23678631, 32136363, 49294631, 61348150, 85237944, 70492586, 79842339, 72655093, 73474145, 82539534, 65101428, 57240031, 79481673, 539293, 38175881

Pergunta: Como realizar a mesclagem de classificação externa e desduplicar esses dados? Ou como desduplicar esses dados?

    
por user3146086 19.03.2015 / 08:39

3 respostas

2

Parece-me que o processo que você está seguindo no momento é este, que falha com o erro de falta de memória:

  1. Crie vários arquivos de dados
  2. Concatená-los juntos
  3. Classifique o resultado, descartando registros duplicados (linhas)

Acho que você deve conseguir executar o seguinte processo

  1. Crie vários arquivos de dados
  2. Classifique cada um independentemente, descartando suas duplicatas ( sort -u )
  3. Mesclar o conjunto resultante de arquivos de dados classificados, descartando duplicatas ( sort -m -u )
por 19.03.2015 / 14:54
0

É claro que não existem ferramentas GNU / Linux: o que é parte do Sistema de Controle de Código Fonte (SCCS), que eu não acredito que exista no Linux.

Então, presumivelmente, você está no Unix. O algoritmo sort é capaz de lidar com esses problemas: o Detalhes algorítmicos do comando de ordenação UNIX afirma que uma entrada de tamanho M , com uma memória de tamanho N , é subdividida em M / N pedaços que se encaixam na memória e que são trabalhados em série.

Deve caber a conta.

    
por 19.03.2015 / 09:15
0
% perl -ne 'if ( $seen{$_}++ ) {
    $count++ ;
    if ($count > 1000000) {
        $seen = () ;
        $count = 0 ;
    }
} else {
    print ;
}' <eof   
a
a
a
b
c
a
a
a
b
c
eof   
a
b
c
%
    
por 19.03.2015 / 16:33