A razão para o processo ser morto pode ser que awk
tem um bug / limitação em matrizes que seu código está atingindo, ou seu código consome muito espaço e atinge algum limite baseado em processo.
Quero dizer, você está tentando construir uma matriz com índice máximo de 10 bilhões (com base no range
) com 1 bilhão de valores definidos. Portanto, awk
precisa potencialmente reservar espaço para 10 bilhões de variáveis. Não estou familiarizado o suficiente para dizer quanto espaço significaria, mas 10 bilhões de números inteiros de 16 bits significariam 18,5 GB, e mesmo que awk
seja inteligente na criação de um array tão esparso, seria necessário mais de 1,8 GB os números que você está gerando.
Para poder manter os resultados exclusivos, você precisará ter todos os valores anteriores em algum lugar, portanto, ele será necessariamente pesado em requisitos de espaço, mas pode ser que alguma outra linguagem permita que o algoritmo seja concluído.
Como escapar dos enormes requisitos de memória, então?
A.Gordon apresenta uma opção, confiando em uma sequência e simplesmente embaralhando-a para aleatoriedade. Isso funciona bem quando há uma exigência de que o resultado seja verdadeiramente números e você deseja que eles sejam de um determinado intervalo. Se o intervalo for mais complexo do que de um para N, você poderá gerar a sequência com awk
e, em seguida, passá-la para sort -R
. Veja também meu comentário sobre a resposta de como tornar o intervalo e a contagem de números produzidos diferentes.
Uma opção poderia ser usar uma função criptográfica (hash) para produzir os números aleatórios, mas, nesse caso, você não pode definir o intervalo como 1 a N, pois essas funções geralmente produzem saída de N bits e você não pode mangle os resultados sem arriscar produzir uma colisão (um número duplicado no conjunto). Tais funções, no entanto, seriam garantidas para produzir facilmente 1 bilhão de saídas únicas (como essas funções hash são projetadas para não produzir a mesma saída duas vezes mesmo com um extremamente grande número de chamadas repetidas). Dependendo da implementação, sua saída pode não ser números, mas strings, e é possível converter a saída da string em números, mas como o tamanho da saída é geralmente muito grande, o intervalo dos números resultantes da conversão seria muito grande. Você pode começar de esta pergunta do Stackoverflow se você Estou interessado em explorar esta opção.
Se você puder arriscar a chance de ter uma colisão, mesmo que isso seja improvável, você pode tentar usar uma boa fonte de aleatoriedade (/ dev / urandom é uma opção) para gerar os 1 bilhão de números. Eu não sei qual a probabilidade de você conseguir 1 bilhão de números únicos, mas tentar valer certamente valeria a pena. Não há uma maneira eficiente de dizer se há uma duplicata no conjunto de resultados, já que isso exigiria ter todos os números na memória para comparação.