Minor nit first: A ordem de saída para find não é lexográfica, pelo menos no Linux. Em vez disso, está na ordem do índice do diretório (que é freqüentemente a ordem de criação).
exec
em si, até o syscall execve
, tem uma sobrecarga não trivial na escala em que você está trabalhando, então é preciso evitá-lo.
Como estrutura geral para a solução, você precisa de pelo menos uma base de dois tópicos:
- gerenciador de filas
- trabalhador (es)
Lógica:
- A fila começa com um único diretório
.
. - Sempre que houver algo disponível na fila e não tivermos atingido o limite de encadeamentos paralelos, inicie um trabalhador com um item da fila.
- O trabalhador: lê o diretório fornecido, não recursivamente.
- Para o novo diretório que ele vê, anexe o diretório à fila.
- Para outro novo arquivo, manipule normalmente.
Casos especiais que precisam ser tratados:
- Múltiplos links simbólicos para a mesma coisa.
- Links simbólicos para outros diretórios (dependendo das suas necessidades de design, você pode não seguir ou ter que seguir várias vezes).
- Loops circulares se seguirem links simbólicos para níveis superiores.
Isso funcionará melhor do que um resultado não paralelo? Essa é uma pergunta difícil e também se resume ao sistema de arquivos / kernel em uso.
Se você está procurando soluções pré-construídas, por exemplo, procure por walkers de diretórios paralelos, mas cuidado com o custo de extra stat
chamadas .