Проблема с клонированием и обработкой больших структур - PullRequest
1 голос
/ 09 апреля 2010

Мой Perl-скрипт имеет странное поведение, которое я не понимаю. Я обрабатываю большую структуру, хранящуюся в виде массива хэшей, которая растет во время обработки. Проблема в том, что при хранении на жестком диске структура имеет около 8 Мб, но во время обработки она занимает около 130 Мб оперативной памяти. Почему такая большая разница?

Основной поток обработки выглядит так:

while(...)
{
    my %new_el = %{Storable::dclone \%some_el};

    # ...
    # change a few things in new_el
    # ...

    push @$elements_ref, \%new_el; 
}

1 Ответ

1 голос
/ 09 апреля 2010

Вы делаете больше копий данных, чем нужно. Старайтесь работать с хэш-ссылками, а не с разыменованием, насколько это возможно:

while (...)
{
    my $new_el = Storable::dclone \%some_el;

    # ...
    # change a few things in new_el
    # ...

    push @$elements_ref, $new_el; 
}

Еще лучше было бы не клонировать весь хэш - возможно, вам удастся изменить его на месте?

...