У меня есть хэш с около 130 000 элементов, и я пытаюсь проверить все комбинации в этом хэше (130 000 x 130 000 комбинаций).Мой код выглядит так:
foreach $key1 (keys %CNV)
{
foreach $key2 (keys %CNV)
{
if (blablabla){do something that doesn't take as long}
}
}
Как и следовало ожидать, для запуска требуется много времени.Кто-нибудь знает более быстрый способ сделать это?Большое спасибо заранее !!
-Abdel
Редактировать: Обновление по блаблабле.
Привет, ребята, спасибо за все отзывы!Действительно ценю это.Я изменил оператор foreach на:
for ($j=1;$j<=24;++$j)
{
foreach $key1 (keys %{$CNV{$j}})
{
foreach $key2 (keys %{$CNV{$j}})
{
if (blablabla){do something}
}
}
}
Хеш теперь многомерный:
$CNV{chromosome}{$start,$end}
Я подробно остановлюсь на том, что именно пытаюсь сделать, в соответствии с просьбой.
Blablabla выглядит следующим образом:
if ( (($CNVstart{$j}{$key1} >= $CNVstart{$j}{$key2}) && ($CNVstart{$j}{$key1} <= $CNVend{$j}{$key2})) ||
(($CNVend{$j}{$key1} >= $CNVstart{$j}{$key2}) && ($CNVend{$j}{$key1} <= $CNVend{$j}{$key2})) ||
(($CNVstart{$j}{$key2} >= $CNVstart{$j}{$key1}) && ($CNVstart{$j}{$key2} <= $CNVend{$j}{$key1})) ||
(($CNVend{$j}{$key2} >= $CNVstart{$j}{$key1}) && ($CNVend{$j}{$key2} <= $CNVend{$j}{$key1}))
)
Короче говоря: хеш-элементы представляют собой определенную часть ДНК (так называемый "CNV", пока думайте о нем как о гене),с началом и концом (которые представляют собой целые числа, представляющие их положение в этой конкретной хромосоме, хранящиеся в хешах с одинаковыми ключами:% CNVstart &% CNVend).Я пытаюсь проверить для каждой комбинации CNV, перекрываются ли они.Если в семье есть два элемента, которые перекрывают друг друга (я имею в виду семью людей, чью ДНК я имею и прочитал; в выражении foreach также есть утверждение «за», которое позволяет программе проверять это для каждой семьи, что делает еедлится еще дольше), я проверяю, есть ли у них одинаковый «номер копии» (который хранится в другом хэше с теми же ключами), и распечатываю результат.
Спасибо, ребята, за ваше время!