我必须处理一个巨大的 XML 文件(>10 GB)才能将其转换为 CSV。我正在使用XML::Twig
.
该文件包含大约 260 万客户的数据,每个客户将有大约 100 到 150 个字段(取决于客户资料)。
我将一个订阅者的所有值存储在 hash%customer
中,处理完成后,我将 hash 的值输出到 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');
}
其他函数 *(value2, value3) 也是如此。我没有提到其他保持简单的功能。
<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
为每个孩子使用,即使几乎每次孩子实例在整个客户资料中只出现一次。它会导致延迟,还是有任何其他建议可以提高性能?线程等?(我用谷歌搜索,发现线程并没有多大帮助。)