ClamAVは、クラシック文字列(Boyer Moore)および正規表現(Aho Corasick)アルゴリズムを使用して検索文字列を保持します。1970年代のアルゴリズムであるため、メモリ効率が非常に高くなります。
問題は、膨大な数のウイルス署名です。これにより、アルゴリズムのデータ構造が非常に大きくなります。
他の部分よりも頻繁にアクセスされるアルゴリズムのデータ構造の部分がないため、これらのデータ構造をスワップに送信することはできません。それらのページを強制的にディスクにスワップする場合、それらはすぐに参照され、すぐに元に戻ります。(技術的には、「データ構造のランダムアクセスにより、データ構造全体がプロセスのワーキングセットに強制されます。 "。)
コマンドラインからスキャンする場合、またはデーモンからスキャンする場合は、データ構造が必要です。
ウイルスシグネチャの一部だけを使用することはできません。送信するウイルスを選択できないため、必要なシグネチャを判別できないためです。
以下は、Debian Wheezyを実行している32ビットマシンで使用されるメモリで、clamdです。
# ps_mem.py
Private + Shared = RAM used Program
281.7 MiB + 422.5 KiB = 282.1 MiB clamd
編集:私は誰かが常駐セットサイズを設定することを提案するのを見ます。これが成功した場合、常駐セットのサイズがワーキングセットのサイズよりも小さくなると、スワップとの間でプロセスがスラッシングします。これにより、システム全体のパフォーマンスが大幅に低下します。いずれにせよ、setrlimit(RLIMIT_RSS、...)のLinuxマニュアルページでは、常駐セットサイズの設定はサポートされなくなり、madvise(MADV_WILLNEED、...)を呼び出さないことを選択したプロセスに影響を及ぼさないと述べています。