共有メンバ利用時の消費メモリ増加について

Perl 5.16 でのこと
並列処理で共有メンバにデータを詰め込んだ後にソートすると消費メモリがどんどん増えてしまうという状況に陥っていた。
詳しいことは分からない。確認したことを記載する。

まず、適当なデータを100万件ほど作成する。
下記プログラムで作成したデータに対し、数パターンの処理を実行したときの消費メモリをざっくり(タスクマネージャーで視認)確認した。

    my @values : shared;
    for ($loop = 1; $loop < 1000000; $loop++) {
        my $codea = sprintf("%08d", int(rand(100000000)));
        my $codeb = sprintf("%08d", int(rand(100000000)));
        push(@values, $codea.$codeb);
    }

データ作成後の消費メモリは約150M。

共有メンバのソート結果をそのまま共有メンバで受け取る

消費メモリは 150M から 950M まで増加していた。

    @values = sort {$a cmp $b} @values;

共有メンバのソート結果を非共有メンバで受け取る

消費メモリは 150M から 550M まで増加していた。

    my @sorted = sort {$a cmp $b} @values;

共有メンバの内容を一度、非共有メンバに格納してから並べ替え(1)

格納後の消費メモリが 150M → 490M となっていた。
ソート時の消費メモリが 490M → 498M となっていた。

    my @sorted = @values;
    @sorted = sort {$a cmp $b} @sorted;

共有メンバの内容を一度、非共有メンバに格納してから並べ替え(2)

格納後の消費メモリが 150M → 277M となっていた。
ソート時の消費メモリが 277M → 285M となっていた。
転送後に @values をクリアしてやると消費メモリは 250M ぐらいになっていた。

    my @sorted;
    foreach (@values) {
        push(@sorted, $_);
    }
    @sorted = sort {$a cmp $b} @sorted;

感想

どうやら共有メンバからまるまる転送する処理がよろしくなかった模様。
Perl 5.8 以降は sort がクイックソートではなくマージソートになっているという情報を見たので、クイックソートならそんなにメモリ消費しないんじゃないの?と考えた時期もあったが、今回はあまり関係なかった。

  • 最終更新:2013-06-11 12:07:01

このWIKIを編集するにはパスワード入力が必要です

認証パスワード