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...), поддерживаемого...