На самом деле максимальный размер памяти в 32-битных системах может варьироваться, составляя до 4 ГБ, но 2 ГБ является общим значением. Часто можно перенастроить ядро, чтобы увеличить его до 3 или 3,5 ГБ. Проблема, конечно же, в том, что у вас просто нет адресного пространства, чтобы отображать больше памяти. Вы пробовали 64-битную машину?
Также не забудьте установить свой ulimit выше, прежде чем вы это сделаете.
Попробуйте
grep -f the_ids.txt huge.csv
Кроме того, поскольку ваши шаблоны кажутся фиксированными строками, использование опции -F
может ускорить grep
.
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
grep -f filter.txt data.txt
становится неуправляемым, когда filter.txt
превышает пару тысяч строк и, следовательно, не является лучшим выбором для такой ситуации. Даже при использовании grep -f
нам нужно помнить несколько вещей:
-x
, если необходимо сопоставить всю строку во втором файле -F
, если в первом файле есть строки, а не шаблоны -w
для предотвращения частичных совпадений, не используя опцию -x
обсуждение этой темы (grep -f
для больших файлов):
И этот пост рассказывает о grep -vf
:
В итоге лучший способ обработки grep -f
для больших файлов:
Соответствие всей строке:
awk 'FNR==NR {hash[[110]]; next} [110] in hash' filter.txt data.txt > matching.txt
Соответствие определенному полю во втором файле (с использованием разделителя ',' и поле 2 в этом примере):
awk -F, 'FNR==NR {hash[$1]; next} $2 in hash' filter.txt data.txt > matching.txt
и для grep -vf
:
Соответствует всей строке:
awk 'FNR==NR {hash[[112]]; next} !([112] in hash)' filter.txt data.txt > not_matching.txt
Соответствует a конкретное поле в второй файл (используя разделитель ',' и поле 2 в этом примере):
awk -F, 'FNR==NR {hash[[113]]; next} !($2 in hash)' filter.txt data.txt > not_matching.txt