Добрый день.
Вести с полей... )
Почему меня так потянуло именно на Socket не понятно, перепроверив всё ещё по 10 раз, я заметил, что огромный объем памяти выделяется не на получении данных, а на их обработке. Сначала я грешил на Encode с перекодировкой из cp1251 в utf8, но оказалось, что конструкция
$data = "" 'U0C*', unpack 'C*', $data; устанавливающая "правильный флаг utf8" выделяет в 40!!!!!!!!!! раз больше памяти, чем данная ей строка. Причем utf8::decode - делающее туже самую операцию не выделяет столько памяти. Проблема решена заменой pack unpack на utf8::decode и utf8::encode но сама логика осталась загадкой. Я кстати всегда думал, что через какое-то время когда память уже не используется процесс её отпускает - а оказывается думал я неверно.
Тест показал, что на строку в 30Mb - требуется 1.2Gb памяти.
Можете глянуть на своей системе вот такой примерчик(при условии что у вас есть свободные 1.2Gb - либо измените длину строки):
========= code ==================
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use POSIX;
use constant PAGESIZE => POSIX::sysconf(POSIX::_SC_PAGESIZE);
my @check = (0..9, "A".."Z", "a".."z");
my $data = "";
$data .= $check[ rand(length @check) ] while (length $data < 30000000);
print "Memory: ".get_memory()."\n";
#$data = "" />$data = "" 'U0C*', unpack 'C*', $data;
print "Memory: ".get_memory()."\n";
sub get_memory {
open my $fh, "/proc/$$/statm" || return;
my $mem = (split( /\s+/, <$fh> ))[1] * PAGESIZE();
close $fh;
return $mem;
}
1;
use utf8;
use strict;
use warnings;
use POSIX;
use constant PAGESIZE => POSIX::sysconf(POSIX::_SC_PAGESIZE);
my @check = (0..9, "A".."Z", "a".."z");
my $data = "";
$data .= $check[ rand(length @check) ] while (length $data < 30000000);
print "Memory: ".get_memory()."\n";
#$data = "" />$data = "" 'U0C*', unpack 'C*', $data;
print "Memory: ".get_memory()."\n";
sub get_memory {
open my $fh, "/proc/$$/statm" || return;
my $mem = (split( /\s+/, <$fh> ))[1] * PAGESIZE();
close $fh;
return $mem;
}
1;
======== code end ================
09.01.2013, 21:23, "Ivan Petrov" <[email protected]>:
use open ':perlio'; моей системе не известны...
Поставил perl 5.10.1 утечка все ровно сохранилась, :perlio так же не
работаетPerl 5.10 это 2007-й год
в чем смысл сейчас ставить компилятор Perl более чем пятилетней
давности? на дворе 2013 год
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
--
С Уважением, Login|off Nick или STork.
С Уважением, Login|off Nick или STork.
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
