Причина была определенно исчерпана памятью.
Поскольку вы не «сравниваете два файла», вы используете один файл размером 250 МБ в качестве источника шаблонов для grep. Grep компилирует эти шаблоны в вариант детерминированного конечного автомата, и представление этих DFA занимает память. Если у вас много шаблонов (например, 250 МБ шаблонов), это занимает много места, потому что преобразование недетерминированного конечного автомата, который соответствует многим шаблонам, в DFA может вызвать экспоненциальный взрыв.
grep
сделан для очень эффективного поиска нескольких шаблонов в одном или нескольких больших файлах. Это не сделано, чтобы "сравнить" файлы. Если вы попытаетесь использовать его для этого, все может пойти не так. Как они сделали в вашем случае.
Сложность имеет значение, поэтому вы узнаете об О-нотации и обо всех этих причудливых вещах.
- В такой ситуации вы используете программу, созданную для вашей ситуации, а не программу, которая использует алгоритм, который экспоненциально для вашей задачи.
Вы сказали, что не хотите знать альтернативу, но поскольку в ней используется менее известный инструмент, я все равно скажу вам:
Если вопрос заключается в том, «существует ли каждая строка файла1 также в файле2, независимо от порядка», то вы должны отсортировать оба файла, а затем использовать comm
, который ожидает отсортированные файлы, и выдает (1) строки в файле1, но не в file2, (2) строки в file2, но не в file1 и (3) строки в обоих файлах, для вашего удобства.