<div>Добрый день.</div><div> </div><div>Появилась интересная проблема, с которой в одиночку справится не могу и обращаюсь к вам.<br /><br />Perl v.5.8.8<br />Операционка CentOs<br /><br />Суть ПО - есть несколько миллионов предложений, программа, с помощью SynamDaemon (когда-то взятом с aot.ru) получает полную семантику предложения, далее проводит кое-какие действия и получаем "новое предложение" (авторерайтинг). В программе были замечены хаотические утечки памяти. Копание и копание и копание нашло место утечки. SynamDaemon на некоторых(редких) предложениях передает в скрипт не 1-2кб данных как обычно, а более 500кб, доходя до 30Мб. Перл выделяет память на получение данных и не освобождает её, причем выделяет довольно крупные размеры и через пару часов работы скрипта он зажирает всю память сервера.<br /><br />Исходники лежат тут http://wwproject.ru/img/test.tar.gz<br />На код не холиварить, там все сумбурно, чтобы собрать всё в единый тест.<br /><br /><br />Я собрал порядка 500 предложений, на которые SynamDaemon неправильно реагирует и прогоняю их по этому тесту.<br />Сразу отмечу, что проверял много раз и память выделяется именно в момент $remote->getline()</div><div> </div><div>Кусок кода:<br />sub test {<br />    my $sentences = Conf->base('slave')->selectall_arrayref("SELECT * FROM parse_test ORDER by id ASC", { Slice=>{} } );    <br />    foreach my $sentence (@$sentences) {<br />        print "\n--------------------\n";<br />        print "ID: ".$sentence->{'id'}."  ";<br />        my $ret_rules = get_socket_data($sentence->{'data_text'});<br />        print "\n Memory: ".get_memory();<br />    }    <br />}<br /><br />sub get_socket_data {<br />    my $sentence = shift;<br />    <br />    $sentence = utf_to_cp1251(pack 'C*', unpack 'U0C*', $sentence);<br />    <br />    my $lang = "_Russian";<br />    my $str = $lang."#".utf_to_cp1251($sentence);<br />    my $strLen = length($str);<br />    <br />    my $req = pack("V", $strLen).$lang."#".$sentence;<br />    <br />    my @data=();<br />    <br />    my $remote = IO::Socket::INET->new(<br />        'Proto'    => 'tcp',<br />        'Timeout'  => 3,<br />        'PeerAddr' => 'localhost',<br />        'PeerPort' => 9090<br />    );<br /><br />    if ($remote) {<br />        print $remote $req;<br />        #push @data,$remote->getlines();        <br />        <br />        my $i=0;<br />        while ( my $line = $remote->getline ) {<br />            push @data,$line;<br />            $i++;<br />        }<br />        #warn "Lines: ".$i; # вот тут оказалось, что все идет в 1 строку<br />        close $remote;<br />    }<br /><br />    my $result = pack 'U0C*', unpack 'C*', cp1251_to_utf(join('',@data));<br />    <br />    print "Get Length: ".(length $result);<br />    <br />    return $result;<br />}<br /><br /><br />Кусок кода из логов:<br />--------------------<br />ID: 1  Get Length: 1157940<br /> Memory: 124506112<br />--------------------<br />ID: 2  Get Length: 1730569<br /> Memory: 169852928<br />--------------------<br />ID: 3  Get Length: 3447876<br /> Memory: 280252416<br />--------------------<br />ID: 4  Get Length: 1009747<br /> Memory: 272359424<br />--------------------<br />ID: 5  Get Length: 1085522<br /> Memory: 272359424<br />--------------------<br />ID: 6  Get Length: 3535001<br /> Memory: 296792064<br />--------------------<br />ID: 7  Get Length: 2091008<br /> Memory: 292573184<br />--------------------<br />ID: 8  Get Length: 2776465<br /> Memory: 301273088<br />--------------------<br />ID: 9  Get Length: 5706835<br /> Memory: 445558784<br />--------------------<br />ID: 10  Get Length: 6386430<br /> Memory: 561889280<br />--------------------<br />ID: 11  Get Length: 2291249<br /> Memory: 522055680<br />--------------------<br /><br /><br />--------------------<br />ID: 212  Get Length: 1769513<br /> Memory: 731144192<br />--------------------<br />ID: 213  Get Length: 550348<br /> Memory: 731144192<br />--------------------<br />ID: 214  Get Length: 541876<br /> Memory: 703389696<br />--------------------<br />ID: 215  Get Length: 17032988<br /> Memory: 1192304640<br />--------------------<br />ID: 216  Get Length: 4204764<br /> Memory: 1158500352<br />--------------------<br />ID: 217  Get Length: 1631550<br /> Memory: 1158500352<br />--------------------<br /><br /><br />--------------------<br />ID: 251  Get Length: 724272<br /> Memory: 1110773760<br />--------------------<br />ID: 252  Get Length: 2905076<br /> Memory: 1126662144<br />--------------------<br />ID: 253  Get Length: 1179906<br /> Memory: 1126662144<br />--------------------<br />ID: 254  Get Length: 26327835<br /> Memory: 1879842816<br />--------------------<br />ID: 255  Get Length: 2612506<br /> Memory: 1762312192<br />--------------------<br />ID: 256  Get Length: 1997323<br /> Memory: 1762312192<br />--------------------<br /><br />--------------------<br /><br />Главный вопрос тут, почему память не освобождается? И какие есть возможные пути решения?<br /><br /></div><div> </div><div> </div><div> </div><div> </div><div>-- <br /> С Уважением, Login|off Nick или STork.</div>