ClamAV содержит строки поиска с использованием алгоритмов классических строк (Бойера Мура) и регулярных выражений (Aho Corasick). Будучи алгоритмами 1970-х годов, они чрезвычайно эффективны в использовании памяти.
Проблема заключается в огромном количестве вирусных сигнатур. Это приводит к тому, что структуры данных алгоритмов становятся достаточно большими.
Вы не можете отправить эти структуры данных для свопинга, так как нет никаких частей структур данных алгоритмов, к которым обращаются реже, чем другие части. Если вы заставите страницы их поменять местами на диске, то на них будут ссылаться через мгновение и просто поменять местами обратно. (Технически мы говорим: «произвольный доступ к структуре данных заставляет всю структуру данных находиться в рабочем наборе памяти процесса»). ».)
Структуры данных необходимы, если вы сканируете из командной строки или сканируете из демона.
Вы не можете использовать только часть вирусных сигнатур, так как не можете выбрать, какие вирусы вам будут отправлять, и, следовательно, не можете определить, какие сигнатуры вам понадобятся.
Вот память, используемая на 32-битной машине, на которой запущен Debian Wheezy.
# ps_mem.py
Private + Shared = RAM used Program
281.7 MiB + 422.5 KiB = 282.1 MiB clamd
Изменить: я вижу, кто-то предлагает установить размер резидентного набора. Если это удастся, то размер резидентного набора меньше размера рабочего набора приведет к тому, что процесс будет перебрасываться в режим свопинга и обратно. Это существенно снизит производительность всей системы. В любом случае на странице руководства Linux для setrlimit (RLIMIT_RSS, ...) говорится, что установка размера резидентного набора больше не поддерживается и никогда не влияла на процессы, которые решили не вызывать madvise (MADV_WILLNEED, ...).