Добрый день.
 
Вести с полей... )
 
Почему меня так потянуло именно на 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;
 
 
======== 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.
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить