В Perl, как я могу освободить память к операционной системе?

Существует только 4 вида:

  1. Внутреннее объединение : наиболее распространенный тип. Выходная строка производится для каждой пары входных строк, которые соответствуют на условиях объединения.
  2. Левое внешнее объединение : то же как внутреннее объединение, за исключением того, что, если существует какая-либо строка, для которой справа не может быть найдена никакая строка соответствия в таблице, строка производится содержащий значения от таблицы слева, с NULL для каждого значения в таблице справа. Это означает, что каждая строка от таблицы слева появится, по крайней мере, однажды в выводе.
  3. Правильное внешнее объединение : то же, поскольку левое внешнее объединение, кроме с ролями таблиц инвертируется.
  4. Полное внешнее объединение : комбинация левых и правых внешних объединений. Каждая строка от обеих таблиц появится в выводе, по крайней мере, однажды.

А "перекрестное объединение" или "декартово соединение" является просто внутренним объединением, для которого никакие условия объединения не были определены, приведя ко всем парам производимых строк.

Благодаря RusselH для указания на ПОЛНЫЕ соединения, которые я опустил.

12
задан Schwern 7 August 2009 в 20:32
поделиться

4 ответа

В общем, нельзя ожидать, что Perl освободит память для ОС.

См. FAQ: Как я могу освободить массив или хэш, чтобы моя программа сжалась? .

Обычно вы не можете. Память, выделенная для лексических элементов (например, my () переменных), не может быть восстановлена ​​или использована повторно, даже если они выходят за рамки. Он зарезервирован на случай, если переменные вернутся в область видимости. Память, выделенная для глобальных переменных, может быть повторно использована (в вашей программе) с помощью undef () и / или delete () .

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

12
ответ дан 2 December 2019 в 03:49
поделиться

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

Если действительно необходимо, выполняйте свою работу в разветвленном процессе, а затем выйдите.

8
ответ дан 2 December 2019 в 03:49
поделиться

В общем, да, именно так работает управление памятью в UNIX. Если вы используете Linux с последней версией glibc и используете этот malloc, вы можете вернуть свободную память в ОС. Однако я не уверен, что Perl делает это.

Если вы хотите работать с большими наборами данных, не загружайте все это в память, используйте что-то вроде BerkeleyDB:

https://metacpan.org/pod/ BerkeleyDB

Пример кода, дословно украден:

  use strict ;
  use BerkeleyDB ;

  my $filename = "fruit" ;
  unlink $filename ;
  tie my %h, "BerkeleyDB::Hash",
              -Filename => $filename,
              -Flags    => DB_CREATE
      or die "Cannot open file $filename: $! $BerkeleyDB::Error\n" ;

  # Add a few key/value pairs to the file
  $h{apple}  = "red" ;
  $h{orange} = "orange" ;
  $h{banana} = "yellow" ;
  $h{tomato} = "red" ;

  # Check for existence of a key
  print "Banana Exists\n\n" if $h{banana} ;

  # Delete a key/value pair.
  delete $h{apple} ;

  # print the contents of the file
  while (my ($k, $v) = each %h)
    { print "$k -> $v\n" }

  untie %h ;

(Хорошо, не дословно. Их использование use vars является ... устаревшим ...)

Вы можете хранить гигабайты данных в таким образом, вы будете использовать только крошечный бит памяти. (По сути, все, что пейджер BDB решает сохранить в памяти; это можно контролировать.)

19
ответ дан 2 December 2019 в 03:49
поделиться

Попробуйте перекомпилировать perl с опцией -Uusemymalloc, чтобы использовать системные malloc и free. Вы можете увидеть другие результаты

0
ответ дан 2 December 2019 в 03:49
поделиться
Другие вопросы по тегам:

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