Привет Я пытаюсь найти группы из файлов на основе 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?
У меня есть один скрипт, который генерирует ssdep файлов. И я кластер в другом скрипте, который только сравнивает результат (который показан выше). Моя проблема связана со второй фазой, когда я их кластер. –
Профиль. Где профайлер говорит, что вы используете большую часть своего времени? –