0

我必须为项目使用 clamAV 签名数据库编写病毒扫描程序。为了提高速度,我使用线程。(组合 & 并等待)我的代码是如何工作的:

它读取文件夹和子文件夹中的所有文件

function recursive_files()
{
files=$(find $folder_path -type f)
for f in $files
do
    raw_and_scan "$f" &
done
wait
}

如您所见,每个文件都有一个线程。

function raw_and_scan()
{
raw_test_file $1
read_signature_db_by_line $1
}

read_signature..读取签名库的每一行

    function  read_signature_db_by_line()
    {
    cat $signature_path | (while read LINE ; do
        stringtokenizer_line_db $LINE $1 $raw_file &
    done
    wait
    )  }

如您所见,DB 的每一行都有一个线程。

我做了双线程实现,因为我看到了巨大的性能(使用时间基准)

当我将 50 个包含 50 行的文件扫描到数据库中时。它工作正常。

但是当我扫描我的主文件夹(800 个文件)时,它不起作用,更糟糕的是,我收到了一个警告(不能 fork() 了)并且我的计算机死机了,它需要重新启动。

我观察这个过程(htop)直到它工作了 5000 个任务。

您可以提交我的项目https://github.com/peondusud/Bash.antivir

最后,我会使用数据库 65000 行扫描文件夹。

如果您有任何想法限制线程或类似的东西。

谢谢。

4

1 回答 1

1

您看到从单个进程(不是线程)到两个进程的巨大改进并不意味着您将使用 5000 个进程超快!实际上是相反的——如果你打算让进程做密集的工作,你应该将它限制在系统中 2* 数量的 cpu 内核(这是一个通用的经验法则)

于 2012-11-11T12:09:53.140 回答