ClamAV тримає рядки пошуку, використовуючи класичний рядок (Boyer Moore) та алгоритми регулярного вираження (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, ...).