Мне нужно обработать огромный XML-файл (> 10 ГБ), чтобы преобразовать его в CSV. Я использую XML::Twig
.Проблема с производительностью с использованием XML :: Twig для обработки гигантских файлов (> 10 ГБ)
Файл содержит данные около 2,6 млн. Клиентов, каждый из которых будет иметь от 100 до 150 полей (в зависимости от профиля клиентов).
Я сохраняю все значения одного абонента в хеш-файле %customer
, и когда обработка завершена, я вывожу значения хэша в текстовый файл в формате CSV.
Проблема - производительность. Для его обработки требуется от 6 до 8 часов. Как это можно уменьшить?
my $t = XML::Twig->new(
twig_handlers => {
'objects/simple' => \&simpleProcess ,
'objects/detailed' => \&detailedProcess ,
},
twig_roots => { objects => 1}
);
sub simpleProcess {
my ($t, $simple) = @_;
%customer=(); #reset the hash
$customer{id} = $simple->first_child_text('id');
$customer{Key} = $simple->first_child_text('Key');
}
Подробные теги содержат несколько полей, включая вложенные поля. Поэтому я каждый раз вызываю функцию для сбора различных типов полей.
sub detailedProcess {
my ($t, $detailed1) = @_;
$detailed = $detailed1;
if ($detailed->has_children('profile11')){ &profile11();}
if ($detailed->has_children('profile12')){ &profile12();}
if ($detailed->has_children('profile13')){ &profile13();}
}
sub profile11 {
foreach $comcb ($detailed->children('profile11')) {
$customer{COMCBcontrol} = $comcb->first_child_text('ValueID');
}
То же самое касается других функций * (значение2, значение3). Я не упомянул о других функциях, обеспечивающих его простоту.
<objecProfile>
<simple>
<id>12345</id>
<Key>N894FE</Key>
</simple>
<detailed>
<ntype>single</ntype>
<SubscriberType>genericSubscriber</SubscriberType>
<odbssm>0</odbssm>
<osb1>true</osb1>
<natcrw>true</natcrw>
<sr>2</sr>
<Profile11>
<ValueID>098765</ValueID>
</Profile11>
<Profile21>
<ValueID>098765</ValueID>
</Profile21>
<Profile22>
<ValueID>098765</ValueID>
</Profile22>
<Profile61>
<ValueID>098765</ValueID>
</Profile61>
</detailed>
</objectProfile>
Теперь вопрос: Я использую foreach
для каждого ребенка, даже если почти каждый раз, когда экземпляр ребенка происходит только один раз по всему профилю клиента. Может ли это вызвать задержку или какие-либо другие предложения по улучшению производительности? Threading и т. Д.? (Я искал googled и обнаружил, что резьба не очень помогает.)
Является ли содержащим элемент '