Существует только 4 вида:
NULL
для каждого значения в таблице справа. Это означает, что каждая строка от таблицы слева появится, по крайней мере, однажды в выводе. А "перекрестное объединение" или "декартово соединение" является просто внутренним объединением, для которого никакие условия объединения не были определены, приведя ко всем парам производимых строк.
Благодаря RusselH для указания на ПОЛНЫЕ соединения, которые я опустил.
В общем, нельзя ожидать, что Perl освободит память для ОС.
См. FAQ: Как я могу освободить массив или хэш, чтобы моя программа сжалась? .
Обычно вы не можете. Память, выделенная для лексических элементов (например,
my ()
переменных), не может быть восстановлена или использована повторно, даже если они выходят за рамки. Он зарезервирован на случай, если переменные вернутся в область видимости. Память, выделенная для глобальных переменных, может быть повторно использована (в вашей программе) с помощьюundef ()
и / илиdelete ()
.В большинстве операционных систем память, выделенная для программы никогда не могут быть возвращены в систему. Вот почему длительные программы иногда повторяются. Некоторые операционные системы (в частности,
Почему вы хотите, чтобы Perl освободил память для ОС? Вы можете просто использовать более крупный своп.
Если действительно необходимо, выполняйте свою работу в разветвленном процессе, а затем выйдите.
В общем, да, именно так работает управление памятью в 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 решает сохранить в памяти; это можно контролировать.)
Попробуйте перекомпилировать perl с опцией -Uusemymalloc, чтобы использовать системные malloc и free. Вы можете увидеть другие результаты