2010-04-09 5 views
1

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

Основной поток обрабатывающий выглядит следующим образом:

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

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

    push @$elements_ref, \%new_el; 
} 

ответ

1

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

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

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

    push @$elements_ref, $new_el; 
} 

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

+0

Но что это значит? Что означает, что я делаю больше копий, чем мне нужно? Я не понимаю. Я меняю код так, как вы советуете, но ничего не меняет в использовании памяти. – jesper

+0

Разница между обработкой хэшей и hashrefs заключается в том, что вы не делаете копии всех ключей и значений, но если вы не видите улучшения, вам нужно будет изучить, как и почему вы копируете данные и обрабатываете свои данные в небольших кусках. – Ether