我有一个perl程序从pcap文件中读取流的数据包,但是需要花费很多时间,我想让它并行,但我不知道它是否可能?如果是的话可以我是用MPI做的?还有另一个问题,这个代码并行的最佳方法,这是我的代码片段(我想我应该在这部分上进行并行处理,但我不知道最好的方法!)< / p>
while (!eof($inFileH))
{
#inFileH is the handler of the pcap file
#in each while I read one packet
$ts_sec = readBytes($inFileH,4);
$ts_usec = readBytes($inFileH,4);
$incl_len = readBytes($inFileH,4);
$orig_len = readBytes($inFileH,4);
if ($totalLen == 0) # it is the 1st packet
{
$startTime = $ts_sec + $ts_usec/1000000;
}
$timeStamp = $ts_sec + $ts_usec/1000000 - $startTime;
$totalLen += $orig_len;
$#packet = -1; n # initing the array
for (my $i=0 ; $i<$incl_len ; $i++) #read all included octects of the current packet
{
read $inFileH, $packet[$i], 1;
$packet[$i] = ord($packet[$i]);
}
#and after that I will work on the "packet" and analyze it
那么我应该如何发送文件内容供其他处理器并行处理呢.....
答案 0 :(得分:1)
首先,您需要确定瓶颈。如果它确实是CPU使用率(即在运行脚本时CPU使用率为100%),则需要确定处理花费时间的位置。
这可能与您解析输入的方式有关。可能有明显的方法可以加快速度。例如,如果你使用复杂的正则表达式,并专注于正确匹配输入,可能有办法通过重写表达式或在尝试更复杂的匹配之前做更简单的匹配来使匹配更快。
如果你不能以这种方式减少CPU使用率,并且你真的想要并行化,那么看看你是否可以使用Perl诞生的机制:Unix pipes。您可以编写在管道中将数据传递给彼此的Perl脚本,或者您可以在Perl本身内创建流程和管道(请参阅perlopentut,如果这还不够,{{3} })。
作为一般规则,在尝试其他机制之前,我会首先考虑这些选项,但这实际上取决于您尝试执行的操作的详细信息以及您需要执行此操作的上下文。