Хеш уменьшается в Perl, поскольку Вы удаляете элементы?

8
задан Brian G 24 September 2008 в 23:03
поделиться

6 ответов

В целом Perl не может возвратить память операционной системе. Это может снова использовать память внутренне, тем не менее, которая могла уменьшить объем памяти, необходимый программе.

См. perlfaq3: Как я могу освободить массив или хешировать так мои уменьшения программы?

Если память, используемая хешами, является чрезмерной (т.е.>. физическая память), Вы могли tie их в файл на диске. Это значительно уменьшило бы Ваше использование памяти, но было бы предупреждено, что доступ к структуре на диске намного медленнее, чем доступ к тому в памяти. (Так дисковая перегрузка.)

7
ответ дан 5 December 2019 в 05:00
поделиться

Вы могли бы хотеть проверить что-то как DBM:: Глубоко. Это делает тот связывающий материал, который упомянул Michael, таким образом, Вы не должны думать об этом. Все хранится на диске вместо в памяти. Это просто нуждается в необходимости в более необычном сервере базы данных.

Кроме того, если Вы хотите разыскать узкое место производительности, проверьте Devel:: NYTProf, новая жаркость в Perl, представляющем, который вышел из Нью-Йорк таймс.

11
ответ дан 5 December 2019 в 05:00
поделиться

Если Ваш хеш является действительно гигантским, лучшая стратегия состоит в том, чтобы, вероятно, использовать дисковый хеш и позволять ОС волноваться о получении вещей в и из памяти. Я особенно люблю Беркли DB для хранения больших хешей на диске, и модуль Perl BerkeleyDB обеспечивает полнофункциональный интерфейс, включая связанный API.

DBM:: Глубоко может также использоваться в качестве общедоступной замены хеша, но полагается на ее собственный формат. Это может быть болью, если Ваша структура должна быть считана другим (не-Perl) системы.

5
ответ дан 5 December 2019 в 05:00
поделиться

Если исходные данные во втором файле необходимы только однажды (поскольку они читаются), Вы могли потенциально сократить использование памяти в половине.

В зависимости от Вашего алгоритма Вы могли бы даже смочь просто держать оба открытые дескрипторов файлов и маленький хеш значений not-used-yet в памяти. Примером было бы слияние или сравнение отсортированных данных - только необходимо оставаться на текущей линии из каждого файла и сравнить его друг с другом, когда Вы идете, перескакивая до cmp изменения.

Другой подход мог бы быть должен сделать несколько передач, особенно если у Вас есть одно или несколько иначе неактивных ядер в Вашей машине. Открытые каналы чтения и имеют канал подпроцессов Вы данные в управляемых предварительно организованных блоках.

Для большего количества универсальных алгоритмов можно только постараться не платить за емкость памяти путем торговли им на стоимость скорости диска.

В большинстве случаев загрузка каждого источника данных в память только побеждает на времени разработки - затем Вы платите за него в месте и/или скорости, когда N становится большим.

4
ответ дан 5 December 2019 в 05:00
поделиться

Относительно конкретного вопроса: Нет, удаление ключей хеша не уменьшает потребление памяти Вашей программы.

Относительно более общего случая: значительное большинство программ и языков продолжит держаться за память, которую они ранее использовали, но в настоящее время не используют. Это вызвано тем, что запрос выделения памяти операционной системой является относительно медленной операцией, таким образом, они сохраняют его в случае, если это необходимо снова позже.

Так, если Вы захотите изменить к лучшему эту ситуацию, то необходимо будет уменьшить пиковый объем памяти, требуемый программой, ли путем пересмотра алгоритмов для не доступа к такому же количеству данных сразу, при помощи дискового устройства хранения данных (такого вышеупомянутый DBM:: Глубоко), или путем освобождения пространства от ненужных переменных назад к жемчугу (позволяют им выйти из объема или установить их на undef) так, чтобы это могло быть снова использовано.

5
ответ дан 5 December 2019 в 05:00
поделиться

Обходное решение: разветвите дочерний процесс, который выделяет всю ту память. Позвольте ему пасовать назад некоторую совокупную информацию, когда это сделает выполнение ее вещи; когда разветвленный процесс умрет, его память пойдет с ним. Что-то вроде боли, но работы для некоторых случаев. Пример случая, где это помогает, был бы то, при обработке многих файлов, каждый файл по одному, только несколько файлов являются большими, и мало промежуточного состояния должно быть сохранено.

4
ответ дан 5 December 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: