2014-02-14 3 views
0

Привет Я пытаюсь найти группы из файлов на основе ssdep.Как кластер на основе ssdep?

Я создал ssdep файлов и сохранил его в CSV-файле.

Я разбор файла в PERL скрипта следующим образом:

foreach(@all_lines) 
{ 
    chomp; 
    my $line = $_; 

    my @split_array = split(/,/, $line); 
    my $md5 = $split_array[1]; 
    my $ssdeep = $split_array[4]; 

    my $blk_size = (split(/:/, $ssdeep))[0]; 

    if($blk_size ne "") 
    { 
     my $cluster_id = check_In_Cluster($ssdeep); 

     print WFp "$cluster_id,$md5,$ssdeep\n"; 
    } 
} 

Это также проверяет, присутствует ли в ранее кластерной группе ssdeep и если не создает новую группу.

Код для chec_In_Cluster

my $ssdeep = shift; 
my $cmp_result; 

if($cluster_cnt > 0) { 
    $cmp_result = ssdeep_compare($MRU_ssdeep, $ssdeep); 
    if($cmp_result > 85) { 
     return $MRU_cnt; 
    } 
} 

my $d = int($cluster_cnt/4); 
my $thr1 = threads->create(\&check, 0, $d, $ssdeep); 
my $thr2 = threads->create(\&check, $d, 2*$d, $ssdeep); 
my $thr3 = threads->create(\&check, 2*$d, 3*$d, $ssdeep); 
my $thr4 = threads->create(\&check, 3*$d, $cluster_cnt, $ssdeep); 

my ($ret1, $ret2, $ret3, $ret4); 
$ret1 = $thr1->join(); 
$ret2 = $thr2->join(); 
$ret3 = $thr3->join(); 
$ret4 = $thr4->join(); 
if($ret1 != -1) { 
    $MRU_ssdeep = $ssdeep; 
    $MRU_cnt = $ret1; 
    return $MRU_cnt;  
} elsif($ret2 != -1) { 
    $MRU_ssdeep = $ssdeep; 
    $MRU_cnt = $ret2; 
    return $MRU_cnt;  
} elsif($ret3 != -1) { 
    $MRU_ssdeep = $ssdeep; 
    $MRU_cnt = $ret3; 
    return $MRU_cnt;  
} elsif($ret4 != -1) { 
    $MRU_ssdeep = $ssdeep; 
    $MRU_cnt = $ret4; 
    return $MRU_cnt;  
} else { 
    $cluster_base[$cluster_cnt] = $ssdeep; 
    $MRU_ssdeep = $ssdeep; 
    $MRU_cnt = $cluster_cnt; 
    $cluster_cnt++; 
    return $MRU_cnt;  
} 

и код для Чеха:

sub check($$$) { 
    my $from = shift; 
    my $to = shift; 
    my $ssdeep = shift; 

    for(my $icnt = $from; $icnt < $to; $icnt++) { 
     my $cmp_result = ssdeep_compare($cluster_base[$icnt], $ssdeep); 
     if($cmp_result > 85) { 
      return $icnt; 
     } 
    } 
return -1; 
} 

Но этот процесс занимает очень много времени (для 20-30MB CSV файла он принимает 8-9Hours). Я также пытался использовать многопоточность при проверке в кластере, но не очень помог мне получить от этого.

Поскольку им не нужен синтаксический анализатор csv, например Text :: CSV (из-за меньшей работы на csv), я не использовал его.

Может ли кто-нибудь решить мою проблему? Можно ли использовать hadoop или некоторые другие структуры для группировки на основе ssdep?

ответ

0

Профиль вашего кода.

Убедитесь, что вы не перекомпилируете что-то, что вы могли бы просто кэшировать.

Рассматривали ли вы многофазный подход?

  1. Compute все хэши
  2. Выполнить кластеризацию на предварительно вычисленных хэшей

профиля. Возможно, ssdeep занимает всего 8 часов в вашем наборе данных.

+0

У меня есть один скрипт, который генерирует ssdep файлов. И я кластер в другом скрипте, который только сравнивает результат (который показан выше). Моя проблема связана со второй фазой, когда я их кластер. –

+0

Профиль. Где профайлер говорит, что вы используете большую часть своего времени? –

0

Подсветка: Optimizing ssDeep for use at scale (2015-11-27).

  1. Зависит от назначения, петля и матч SSDEEP в разном размере порции создаст N х (N-1) хэш сравнения. Если вам не нужно найти частичное содержимое, в противном случае избегайте его.

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

  3. Можно уменьшить хэш SSDEEP, сгруппировав аналогичный хеш, сгенерировав хэш «расстояние кузена».

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