ClamAV przechowuje ciągi wyszukiwania za pomocą klasycznych ciągów znaków (Boyer Moore) i algorytmów wyrażeń regularnych (Aho Corasick). Będąc algorytmami z lat siedemdziesiątych, są wyjątkowo wydajne pod względem pamięci.
Problemem jest ogromna liczba sygnatur wirusów. To powoduje, że struktury danych algorytmów stają się dość duże.
Nie można wysyłać tych struktur danych do wymiany, ponieważ nie ma części struktur danych algorytmów, do których dostęp jest rzadszy niż w innych częściach. Jeśli zmusisz ich strony do zamiany dysku, zostaną one przywołane chwilę później i po prostu zamieniają się z powrotem. (Technicznie mówimy „losowy dostęp do struktury danych zmusza całą strukturę danych do roboczego zestawu pamięci procesu „.)
Struktury danych są potrzebne, jeśli skanujesz z wiersza poleceń lub skanujesz z demona.
Nie możesz użyć tylko części sygnatur wirusów, ponieważ nie możesz wybrać wirusów, które zostaną wysłane, a zatem nie możesz powiedzieć, które sygnatury będą potrzebne.
Oto pamięć używana na 32-bitowej maszynie z systemem Debian Wheezy i jest to clamd.
# ps_mem.py
Private + Shared = RAM used Program
281.7 MiB + 422.5 KiB = 282.1 MiB clamd
Edycja: Widzę, że ktoś sugeruje ustawienie rozmiaru zestawu rezydenta. Jeśli to się powiedzie, to posiadanie rezydentnego rozmiaru zestawu mniejszego niż rozmiar zestawu roboczego doprowadzi do przerzucenia procesu do i od zamiany. Spowoduje to znaczne obniżenie wydajności całego systemu. W każdym razie strona podręcznika Linux dla setrlimit (RLIMIT_RSS, ...) mówi, że ustawienie rezydentnego rozmiaru zestawu nie jest już obsługiwane i nigdy nie miało żadnego wpływu na procesy, które zdecydowały się nie wywoływać madvise (MADV_WILLNEED, ...).