gpt4 book ai didi

perl - 使用Text::Table Performance格式化SQL查询

转载 作者:行者123 更新时间:2023-12-03 18:58:35 24 4
gpt4 key购买 nike

下面是将SQL查询转储为对齐的文本表格式的代码。

sub sql_command {
my ($self,$str) = @_;
my $s = $self->{_db}->prepare($str) or die $!;
$s->execute() or die $!;
my $table;
push @$table, [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}];
while(my $row = $s->fetch) {
push @$table, [ map{ defined $_ ? $_ : "undef" }@$row ];
}
return box_format($table);;
}


sub box_format {
my $table = shift;
my $n_cols = scalar @{$table->[0]};

my $tb = Text::Table->new(\'| ', '', (\' | ','')x($n_cols-1), \' |+');
$tb->load(@$table);
my $rule = $tb->rule(qw/- +/);
my @rows = $tb->body();
return $rule, shift @rows, $rule, @rows, $rule
if @rows;
}


输出是预期的。但是从性能角度来看,处理大约5MB的输出文件大约需要30秒。

有没有更好的方法可以实现这一目标?

谢谢!

最佳答案

该代码可能存在一些性能问题。首先是在构建$table时,您要将整个数据集拉入内存。这会占用大量内存。您最好对数据格式化后再输出。这意味着您将使用Text::Table->load而不是使用Text::Table->add

sub sql_command {
my ($self,$sql) = @_;
my $sth = $self->{_db}->prepare($sql) or die $!;
$sth->execute() or die $!;

return box_format_from_query($sth);
}

sub box_format_from_query {
my $sth = shift;
my $headers = [ map { defined $_ ? $_ : "undef" } @{$s->{'NAME'}}];
my $num_cols = @$headers;

my $table = Text::Table->new(\'| ', '', (\' | ','')x($num_cols-1), \' |+');
while(my $row = $s->fetch) {
$table->add(map { defined $_ ? $_ : "undef" } @$row );
}

my $rule = $tb->rule(qw/- +/);
my @rows = $tb->body();
return $rule, shift @rows, $rule, @rows, $rule
if @rows;
}


第二个性能问题可能是Text :: Table本身。由于表方法在数据副本上工作(即,您不传递数据作为引用),因此在编写时就不会考虑到大型数据集。找出答案的唯一方法是分析您的代码。看看 Devel::NYTProf。您应该能够弄清楚代码在哪里花费时间。如果事实证明它位于Text :: Table方法内部,则应联系作者或考虑另一种产生格式化输出的方法。

第三个性能问题可能是您的查询。您没有显示查询,但是完全没有效率。 Devel :: NYTProf会告诉您是否在 $sth->execute上花费了大量时间。如果是这样,您还有另一个问题要问。 :)

关于perl - 使用Text::Table Performance格式化SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com