В целом Perl не может возвратить память операционной системе. Это может снова использовать память внутренне, тем не менее, которая могла уменьшить объем памяти, необходимый программе.
См. perlfaq3: Как я могу освободить массив или хешировать так мои уменьшения программы?
Если память, используемая хешами, является чрезмерной (т.е.>. физическая память), Вы могли tie
их в файл на диске. Это значительно уменьшило бы Ваше использование памяти, но было бы предупреждено, что доступ к структуре на диске намного медленнее, чем доступ к тому в памяти. (Так дисковая перегрузка.)
Вы могли бы хотеть проверить что-то как DBM:: Глубоко. Это делает тот связывающий материал, который упомянул Michael, таким образом, Вы не должны думать об этом. Все хранится на диске вместо в памяти. Это просто нуждается в необходимости в более необычном сервере базы данных.
Кроме того, если Вы хотите разыскать узкое место производительности, проверьте Devel:: NYTProf, новая жаркость в Perl, представляющем, который вышел из Нью-Йорк таймс.
Если Ваш хеш является действительно гигантским, лучшая стратегия состоит в том, чтобы, вероятно, использовать дисковый хеш и позволять ОС волноваться о получении вещей в и из памяти. Я особенно люблю Беркли DB для хранения больших хешей на диске, и модуль Perl BerkeleyDB обеспечивает полнофункциональный интерфейс, включая связанный API.
DBM:: Глубоко может также использоваться в качестве общедоступной замены хеша, но полагается на ее собственный формат. Это может быть болью, если Ваша структура должна быть считана другим (не-Perl) системы.
Если исходные данные во втором файле необходимы только однажды (поскольку они читаются), Вы могли потенциально сократить использование памяти в половине.
В зависимости от Вашего алгоритма Вы могли бы даже смочь просто держать оба открытые дескрипторов файлов и маленький хеш значений not-used-yet в памяти. Примером было бы слияние или сравнение отсортированных данных - только необходимо оставаться на текущей линии из каждого файла и сравнить его друг с другом, когда Вы идете, перескакивая до cmp
изменения.
Другой подход мог бы быть должен сделать несколько передач, особенно если у Вас есть одно или несколько иначе неактивных ядер в Вашей машине. Открытые каналы чтения и имеют канал подпроцессов Вы данные в управляемых предварительно организованных блоках.
Для большего количества универсальных алгоритмов можно только постараться не платить за емкость памяти путем торговли им на стоимость скорости диска.
В большинстве случаев загрузка каждого источника данных в память только побеждает на времени разработки - затем Вы платите за него в месте и/или скорости, когда N становится большим.
Относительно конкретного вопроса: Нет, удаление ключей хеша не уменьшает потребление памяти Вашей программы.
Относительно более общего случая: значительное большинство программ и языков продолжит держаться за память, которую они ранее использовали, но в настоящее время не используют. Это вызвано тем, что запрос выделения памяти операционной системой является относительно медленной операцией, таким образом, они сохраняют его в случае, если это необходимо снова позже.
Так, если Вы захотите изменить к лучшему эту ситуацию, то необходимо будет уменьшить пиковый объем памяти, требуемый программой, ли путем пересмотра алгоритмов для не доступа к такому же количеству данных сразу, при помощи дискового устройства хранения данных (такого вышеупомянутый DBM:: Глубоко), или путем освобождения пространства от ненужных переменных назад к жемчугу (позволяют им выйти из объема или установить их на undef) так, чтобы это могло быть снова использовано.
Обходное решение: разветвите дочерний процесс, который выделяет всю ту память. Позвольте ему пасовать назад некоторую совокупную информацию, когда это сделает выполнение ее вещи; когда разветвленный процесс умрет, его память пойдет с ним. Что-то вроде боли, но работы для некоторых случаев. Пример случая, где это помогает, был бы то, при обработке многих файлов, каждый файл по одному, только несколько файлов являются большими, и мало промежуточного состояния должно быть сохранено.