我有项目使用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
) }
如您所见,对于每一行数据库都有一个主题。
我做了双线程实现,因为我看到了巨大的性能(使用时间基准)
当我将50行50个文件扫描到数据库中时。它工作正常。
但是当我扫描我的主文件夹(800个文件)时它不起作用,更糟糕的是我收到了警告(不能再用fork())并且我的计算机冻结了,它需要重新启动。
我观察过程(htop),直到它完成5000个任务。
您可以提交我的项目https://github.com/peondusud/Bash.antivir
最后,我会用数据库65000行扫描文件夹。
如果您有任何想法限制线程或类似的东西。
感谢。
答案 0 :(得分:1)
事实上,你看到从一个进程(而不是线程)到两个进程的巨大进步并不意味着你将使用5000个进程超快速地进行!实际上情况恰恰相反 - 如果您计划让流程进行密集型工作,您应该将其限制为系统中2 *个cpu核心数(这是一般的经验法则)