Explicação adicional baseada no desempenho do sistema de arquivos NTFS
Depois de escrever a seção inferior desta resposta, o OP apontou que o script está sendo executado em um disco NTFS e suspeita que isso possa ser parte do problema.
Isso não seria muito surpreendente: há problemas de desempenho com o NTFS especiffically relacionados ao manuseio de muitos arquivos pequenos. E estamos criando arquivos pequenos na ordem de milhões - por arquivo de entrada.
Assim, o desempenho ruim do NTFS seria uma explicação alternativa para a degradação do desempenho, enquanto o uso extremo do memmory parece ainda estar relacionado ao mmap ().
Desempenho ruim do NTFS
Configurando o sistema de arquivos NTFS para desempenho
Explicando o problema de memória pelo strong uso de mmap ()
O problema de memória que ocorre com split
em seu script parece estar relacionado ao uso do mmap em 'split'.
strace
mostra as seguintes chamadas para cada arquivo de saída:
28892 open("xx02", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
28892 fstat(3, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
28892 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f821582f000
28892 write(3, "sometext\n", 30) = 30
28892 close(3) = 0
28892 munmap(0x7f821582f000, 4096) = 0
Com base nos exemplos, para uma estimativa aproximada dos arquivos a serem tratados,
assumimos arquivos de entrada de 300MB, arquivos de saída de 100B:
Isso nos dá cerca de 3000000 arquivos para escrever. Nós escrevemos apenas um de uma vez. Mas usamos mmap()
. Isso significa que, para cada um dos arquivos, pelo menos uma página de memória é usada, que tem 4096 B de tamanho.
Levando isso em consideração, tocamos cerca de 12 GB de memória (1) para um arquivo de entrada (mas não todos de uma vez). Três milhões de arquivos e 12 GB, parece que poderia causar algum trabalho para o kernel.
Basicamente, parece que split
é apenas não criado para este trabalho , porque usa mmap () .
Isso é bom em outras situações.
Mas neste caso extremo de entrada, ele irá bagunçar o gerenciamento de memória mal - o que então precisa de algum tempo para limpar. (2)
(2) Ele não usará muito memmory ao mesmo tempo, mas sim um grande número de pequenos arquivos em pouco tempo.
(1) Ou apenas espaço de endereçamento?