Утечка памяти в параллельной программе или просто так? - PullRequest
0 голосов
/ 04 февраля 2019

Это упрощенная версия программы, которая имеет два канала для выполнения какой-либо операции

use v6;

my $length = 512;
my Channel $channel-one .= new;
my Channel $to-mix .= new;
my Channel $mixer = $to-mix.Supply.batch( elems => 2).Channel;

my @promises;
for ^4 {
    $channel-one.send( 1.rand xx $length );
    my $promise = start react whenever $channel-one -> @crew {
        my @new-crew = @crew;
        @new-crew[@new-crew.elems.rand] = 1;
        if ( sum(@new-crew) < $length ) {
          say "Emitting  in thread ", $*THREAD.id, " Best ", sum(@crew)  ;
          $to-mix.send( @new-crew );
        } else {
           say "Found: closing";
           $channel-one.close;
           say "Closed";
        };
    }
    @promises.push: $promise;

}

my $pairs = start react whenever $mixer -> @pair {
    $to-mix.send( @pair.pick ); # To avoid getting it hanged up
    my @new-population =  crossover-frequencies( @pair[0], @pair[1] );
    $channel-one.send( @new-population);
    say "Mixing in ", $*THREAD.id;
};
await @promises;
say "Finished";

# Cross over frequencies
sub crossover-frequencies( @frequencies, @frequencies-prime --> Array ) is export {
    my @pairs = @frequencies Z @frequencies-prime;
    my @new-population =  gather {
        for @pairs -> @pair {
            take @pair.pick;
        }
    };
    return @new-population;
}

В ней используется один канал для выполнения какой-либо операции (здесь упрощенно для установки случайного элемента на один) и другойдля смешивания элементов, взятых в парах.Он работает и завершается через некоторое время, но для указанных размеров он начинает увеличивать использование памяти, пока не достигнет почти 1 ГБ, прежде чем закончится.

Возможно, это микширующий канал, который растет, но я не вижу его в качестве источника утечки, поскольку он получает один элемент из одного блока, а другой - из другого;на канале может быть несколько оставшихся до окончания, но не так много, чтобы оправдать переполнение памяти.Любая другая идея?Дополнительная проблема заключается в том, что он, кажется, всегда использует один и тот же поток для «обработки», несмотря на то, что было запущено 4 разных потока.Я не знаю, связано это или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...