-
O motivo foi definitivamente ficou sem memória.
-
Como você não está "comparando dois arquivos", está usando um arquivo de 250 MB como fonte de padrões para o grep. O Grep compila esses padrões em uma variante de um autômato finito determinístico , e a representação desses DFAs consome memória. Se você tem muitos padrões (como 250MB de padrões), ocupa um lote de espaço, porque transformar o autômatos finitos não determinísticos que correspondem a muitos padrões em um DFA podem causar um aumento exponencial.
grep
é feito para parecer muito eficiente para alguns padrões em um ou vários arquivos grandes. Não é feito para "comparar" arquivos. Se você tentar usá-lo para isso, as coisas podem dar errado. Como eles fizeram no seu caso.
A complexidade é importante, é por isso que você aprende sobre a notação de O e sobre todas essas coisas extravagantes.
- Em tal situação, você usa um programa que é feito para sua situação, não um programa que usa um algoritmo que é exponencial de espaço para o seu tipo de problema.
Você disse que não queria saber a alternativa, mas como ela envolve uma ferramenta menos conhecida, vou lhe dizer de qualquer maneira:
Se a pergunta for "toda linha do arquivo1 também existe no arquivo2, independentemente da ordem", o que você faz é classificar os dois arquivos e, em seguida, usar comm
, que espera os arquivos classificados, e coloca fora (1 ) linhas no arquivo1, mas não no arquivo2, (2) linhas no arquivo2, mas não no arquivo1 e (3) linhas nos dois arquivos, conforme sua conveniência.