2014-01-20 3 views
0

У меня есть программа perl, которая считывает пакеты потока из файла pcap, но это занимает много времени, я хочу сделать его параллельным, но я не знаю, возможно ли это или не так ли? Если да, я могу сделать это с помощью MPI? и еще один вопрос, лучший способ сделать этот код параллельным, вот часть моего кода (я думаю, что я должен работать над этой частью для параллелизма, но я не знаю, лучший способ!)Параллельно выполнение языка perl

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 

так как я должен отправить содержимое файла для других процессоров, чтобы работать на нем параллельно .....

ответ

1

Прежде всего, необходимо определить узкое место. Если это действительно использование ЦП (т. Е. Использование ЦП на 100% при запуске скрипта), вам нужно выяснить, где обработка тратит свое время.

Это может быть так, что вы разбираете ввод. Могут быть очевидные способы ускорить это. Например, если вы используете сложные регулярные выражения и фокусируетесь исключительно на правильном вводе правильного ввода, могут быть способы сделать сопоставление намного быстрее, переписав выражения или сделав более простые совпадения перед тем, как попробовать более сложные.

Если вы не можете уменьшить использование ЦП достаточно далеко, и вы действительно хотите распараллелить, посмотрите, можете ли вы использовать механизм, с которым родился Perl: Unix pipes. Вы можете писать сценарии Perl, которые передают данные друг другу в конвейере, или вы можете создавать процессы и каналы внутри самого Perl (см. perlopentut, и если этого недостаточно, perlipc).

Как правило, сначала я рассмотрю эти параметры перед тем, как попробовать другие механизмы, но это действительно зависит от деталей того, что вы пытаетесь сделать, и от контекста, в котором вы должны это делать.

+0

спасибо за ваше полное объяснение, но я думаю, что огромный объем файла является узким местом, так как время выполнения уменьшается, когда файл мал, поэтому я решил разделить файл на языке perl! как вы думаете, это эффективное решение? – user3210586

+0

Наверное, нет. Если вы можете разделить файл, вы можете пойти дальше и даже не упомянуть файл в своем скрипте вообще. Не думайте о вводе в качестве файла, который вам сначала нужно прочитать, а затем обработать, обработать его как поток входных данных, который вы можете прочитать и обработать кусок куском. Это стандартный способ делать вещи в Perl - см., Например, ['<>' construct] (http://stackoverflow.com/questions/189293/how-do-i-get-a-filehandle-from-the-commandline). – reinierpost

+0

Я поставил свой код выше, так как вы сказали, что я использую обработчик файлов, но у меня есть некоторые проблемы с разделением потока! Я не знаю, какой эффективный способ для него !!! вы можете мне помочь? – user3210586

Смежные вопросы