首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML::LibXML: Speedquestion

XML::LibXML: Speedquestion
EN

Stack Overflow用户
提问于 2011-05-29 01:15:29
回答 3查看 770关注 0票数 1

这个脚本大约需要50分钟(文件大小: 22,3 MiB,cpu: atom )。

这是正常的( 50分钟)吗?

我可以调整脚本,让它更快吗?

代码语言:javascript
复制
#!/usr/local/bin/perl
use XML::LibXML;
use DBI;

my $dbh = DBI->connect( "DBI:SQLite:dbname=$db", undef, undef, $options );
my $sth = $dbh->prepare( "INSERT INTO $table ( id, titel, ... ) VALUES ( ?, ?, ... )" );

my $parser = XML::LibXML->new();
my $doc = $parser->load_xml( location => $file );
my @nodes = $doc->findnodes( '//Mediathek/Filme' );

my @keys = qw( Id Titel ... );

for my $node ( @nodes ) {
    my @nodes = $node->findnodes( './*' );
    my %hash;
    @hash{@keys} = ();
    for my $node ( @nodes ) {
        $hash{$node->nodeName} = $node->textContent;
    }
    $sth->execute( @hash{@keys} );
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-29 02:51:18

我非常确定Ashley在指出事务和相关的高成本IO时是正确的。

至于XML部分,考虑到输入文档的大小为22MB,您将需要大约200MB的内存,但是处理速度应该相当快,在几秒而不是几分钟的范围内。

看起来效率低下的一件事是您的完整文档扫描XPath表达式。Mediathek/Filme真的可以出现在文档中的任何地方吗?或者它更像是/Archiv/Mediathek/Filme?除非引擎优化这个表达式,否则使用//的效率很低(据我所知,XML::LibXML不会这样做)。

另一件事是,您可以使用$node->getChildElements而不是$node->findnodes("*") (不需要编写./*),但我认为这并不重要。

票数 3
EN

Stack Overflow用户

发布于 2011-05-29 02:39:28

XML::LibXML非常快。如果您对INSERT进行批处理,则SQLite也是如此。SQLite写入活动受到旋转速度的限制,这是其不写入损坏数据的保证的一部分。因此,您正在寻找的速度增益可能是在事务中。在提交之前,批量处理你的许多/所有的INSERT--我认为批量大小的限制因素将是内存。DBI文档描述了如何做到这一点。

同样,这是未经测试的,但即使我错了,学习事务也是很好的。:P

票数 1
EN

Stack Overflow用户

发布于 2011-11-10 06:14:38

你可以尝试几种方法。

XML:: SAX ::ExpatXS非常快,并且使用标准的SAX interfaces.

  • You可以考虑对使用批量插入,在一条语句中插入多行,这将限制索引重建的数量。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6163156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档