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

Я пытался глобализировать переменные и 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам