Perl не хватает памяти, обработка сообщений только 64 XML-файла каждый из 2MB - Unix - PullRequest
0 голосов
/ 12 июля 2011

Я пытался глобализировать переменные и undef, увеличивая пространство сегмента данных в unix, локализуя переменную, но все равно получая ту же ошибку.Мне нужно обработать около 750 файлов. Может кто-нибудь помочь?Благодарю.Я знаю, что чтение всего файла в строку может быть проблемой.Но я не уверен ни в каких других путях.Но все же, поскольку я объявляю строку как глобальную и делаю ее = "".Должны ли вы освобождать память в следующих итерациях?

foreach my $file_name (@dir_contents) 
{

if(-f "rawdata/$file_name")
{
$xmlres="";
eval {

while(<FILE>)
{
    $xmlres.=$_;
}
close FILE;


 ***$doc=$parser->parsestring($xmlres);***  
foreach my $node($doc->getElementsByTagName("nam1"))
{
    foreach my $tnode($node->getElementsByTagName(("name2")))
    {
        //processing
    }
}
}

}}

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Прежде всего, комментарии к стилю полезны и правильны, и помогут. Однако, если вам нужно обработать 1,5 ГБ XML, вам нужно немного лучше управлять памятью.

XML::DOM не освобождает автоматически используемое пространство. Это признак его возраста, и новые модули намного лучше управляют памятью, и, как правило, делают это автоматически (я также использую XML::LibXML, что делает это, и я также очень рекомендую это).

В основном, вам нужно вызвать метод dispose, чтобы очистить дерево DOM, когда вы закончите с ним. Это довольно ясно в кратком обзоре под XML::DOM. Достаточно просто позвонить, чтобы решить проблемы с памятью. (Технически, деревья DOM, как правило, содержат циклические ссылки, и они не управляются автоматически при простом обращении с подсчетом сбора мусора. Perl использовал слабые ссылки, чтобы помочь, но похоже, что он не был полностью интегрирован в XML::DOM. Просто отсылка к ссылке дерева не достаточно.)

Я бы определенно хотел улучшить стиль в другом месте. Некоторые другие проблемы стиля; Я бы попытался Try::Tiny обработать eval {}, поскольку вы, кажется, используете его главным образом для обработки исключений. Кроме того, несколько неудачных примеров научили меня тому, что использование надежного парсера даты / времени - это всегда хорошая идея. Я использую те в DateTime::Format::*. Есть много странных случаев при разборе даты и времени, и это сэкономит вам строки кода и сделает обработку более надежной.

2 голосов
/ 12 июля 2011

XML :: DOM является старым и ограниченным (не говоря уже о том, что я не думаю, что он больше поддерживается).Попробуйте XML :: LibXML, который очень похож (он также реализует DOM), за исключением более быстрого, более экономичного в памяти, более мощного (полная реализация XPath ...), поддерживаемого ...

...